news 2026/6/14 8:24:58

Late Chunking:长文本嵌入的语义保真新范式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Late Chunking:长文本嵌入的语义保真新范式

1. 项目概述:为什么“晚分块”正在改写长文本嵌入的底层逻辑

你有没有试过把一篇20万字的小说、一份50页的技术白皮书,或者一整套跨年度的会议纪要,直接喂给一个号称支持128K上下文的Embedding模型?结果发现——相似度检索不准、关键段落被淹没、问答召回率断崖式下跌。这不是你的数据有问题,也不是模型标称参数在撒谎,而是你踩中了当前长上下文Embedding技术里最隐蔽、也最普遍的一个设计盲区:早期分块(Early Chunking)的固有缺陷。而“Late Chunking In Long Context Embedding Models”这个标题,指的正是一场静默却深刻的范式转移:把文本切分这个动作,从模型输入前的预处理环节,推迟到模型内部表征已初步成型之后再执行。它不是简单地换了个切分位置,而是重构了信息压缩与语义保留之间的根本权衡关系。

我过去三年深度参与过7个企业级知识库Embedding架构升级项目,从金融研报摘要系统到法律条文比对平台,几乎每个项目都经历过“先切再嵌入→效果不稳→反复调chunk size→最终妥协”的循环。直到去年在ACL'23一篇被引用超400次的论文里看到“Late Chunking”这个词,才真正意识到:我们一直试图用更精细的切分策略去修补一个结构性缺陷,而真正的解法,是让模型自己决定在哪里“呼吸”。这个思路背后牵涉到Transformer注意力机制的局部性约束、位置编码的长程衰减特性、以及向量空间中语义密度的非均匀分布规律——它既不是工程hack,也不是训练技巧,而是一种对“文本如何被理解”这一本质问题的重新建模。如果你正在构建需要处理万字以上文档的RAG系统、智能合同审查工具,或是学术文献综述助手,那么理解Late Chunking,就等于拿到了打开长文本语义精度大门的那把钥匙。它不承诺“一键解决所有长文本问题”,但它能让你少走至少6个月的弯路,避开那些连SOTA模型文档都不会明说的隐性陷阱。

2. 核心设计逻辑:为什么必须把切分动作“往后推”

2.1 早期分块的三大结构性缺陷

传统Embedding流程中,“Early Chunking”指的是在文本送入模型前,由外部工具(如LangChain的RecursiveCharacterTextSplitter)按固定长度(如512 token)或语义边界(如段落)进行硬切分,再将每个chunk单独过模型生成向量。这种做法看似直观,实则埋下三个难以绕过的硬伤:

第一,语义割裂不可逆。以法律合同为例,“甲方应于本协议生效后30日内支付首期款,乙方须在收到款项后5个工作日内开具合规发票”这句话,如果恰好被切在“支付首期款,乙方”处,前半chunk强调付款义务,后半chunk突显开票责任,两个向量在余弦空间里会指向完全不同的方向。而人类阅读时,是把整句话作为一个因果逻辑单元来理解的。Early Chunking强行把一个语义原子打碎,模型再强也无法从两个孤立向量中重建原始逻辑链。我曾用BERT-base对同一份《劳动合同法》逐段切分测试,发现当chunk边界切割在“但书”条款(如“……但下列情形除外”)附近时,相关条款的向量相似度平均下降37.2%,远超随机切分的波动范围。

第二,上下文稀释效应。长文档中真正承载核心信息的往往是少数高密度段落(如技术方案中的算法伪代码、医疗报告里的诊断结论),其余多为背景铺垫或格式化描述。Early Chunking强制将所有chunk等权重处理,导致模型计算资源被大量低信息量文本摊薄。就像用同一台显微镜去观察细胞核和培养皿边缘的灰尘——分辨率没变,但有效观测时间全耗在了无关区域。我们在某券商研报分析项目中实测:当把10页PDF统一切成512-token chunk时,模型对“目标价上调至XX元”这一关键结论的embedding置信度,比将其所在完整段落(含前因后果共1280 token)作为单个输入时低22.8%。

第三,位置编码失真。主流Embedding模型(如text-embedding-3-large、bge-m3)依赖RoPE或ALiBi等位置编码机制,其数学本质是对token间相对距离建模。Early Chunking人为制造了大量虚假的“文档开头”和“文档结尾”,使得模型反复学习“第1个token永远在开头”这类无意义模式,严重干扰其对真实长程依赖的建模能力。这就像让一个语言学家反复分析1000个独立的句子开头,却从不让他看到这些句子如何构成一篇完整的议论文。

提示:这三个缺陷不是可以通过增大chunk size就能解决的。当chunk从512扩大到2048时,语义割裂率下降但计算成本指数级上升;当采用滑动窗口重叠切分时,又会引入大量重复向量,导致检索时返回冗余结果。这是系统性矛盾,而非参数调节问题。

2.2 Late Chunking的核心思想:让模型自己决定“哪里该切”

Late Chunking的破局点在于彻底颠倒处理顺序:先让完整长文本通过模型的底层Transformer层,生成一个稠密的、上下文感知的中间表征序列;再在这个高质量表征空间上,动态识别语义边界并执行切分;最后仅对切分出的关键子序列进行向量化。这个过程可拆解为三个不可跳过的阶段:

Stage 1:全局上下文编码(Global Context Encoding)
将整篇长文本(如8192 token)一次性输入模型,但只运行到中间层(通常是第12~16层,具体取决于模型总层数)。此时输出的不是最终embedding,而是一个shape为[8192, d_model]的token-level hidden state矩阵H。关键在于,这个H已经融合了全文的长程依赖——比如前言里提到的“本协议目的”,会在H中对后文所有条款token的表示产生可测量的梯度影响。我们用t-SNE可视化过某法律文书的H矩阵,发现“违约责任”章节的所有token在隐空间中自然聚集成簇,且与“定义条款”簇保持明确距离,这种结构是Early Chunking永远无法复现的。

Stage 2:语义边界检测(Semantic Boundary Detection)
在H矩阵上运行轻量级边界检测模块。主流方案有两种:

  • 基于梯度的边界探测:计算相邻token hidden state的余弦距离变化率,当距离突增(如从0.12跳到0.45)时标记为潜在边界。原理是语义突变处,模型表征会剧烈调整。
  • 基于注意力熵的边界定位:统计每个token在最后一层注意力中,其注意力权重分布的Shannon熵值。熵值骤降的位置(如从5.2降到2.1),往往对应着新话题的开始——因为模型此时将注意力高度聚焦于少数几个相关token。
    我们在对比测试中发现,梯度法对技术文档更鲁棒(准确率89.3%),而熵值法对叙事性文本更敏感(准确率92.7%),实际部署时建议双路并行取交集。

Stage 3:局部向量生成(Local Vector Generation)
仅将Stage 2识别出的语义段落(如“第3条 付款方式”整个子序列)送入模型剩余层,生成最终embedding。注意:这里生成的不是单个向量,而是该段落内每个token的向量,再通过[CLS] token或池化操作得到段落级向量。由于输入已是语义完整的单元,向量质量天然优于Early Chunking。

这个设计的精妙之处在于:它把“什么是重要信息”这个判断权,从人工规则(如“按句号切分”)移交给了模型自身。就像教一个学生读《红楼梦》,Early Chunking是把全书撕成几百页碎片让他逐页背诵,而Late Chunking是先让他通读三遍建立整体认知,再引导他自主标注“黛玉葬花”“宝玉挨打”这些关键情节节点,最后只针对这些节点做深度解析。

3. 实操实现路径:从理论到可运行代码的完整闭环

3.1 模型选型与改造要点

Late Chunking不是某个特定模型的专利,而是可适配主流开源/闭源Embedding模型的通用范式。但不同模型的改造难度和效果差异极大,需根据项目需求精准选择:

模型类型改造可行性关键改造点推荐场景
开源Llama系(如nomic-ai/nomic-embed-text-v1.5)★★★★☆需修改forward函数,在指定层插入边界检测hook;利用FlashAttention-2优化长序列推理需完全可控、可审计的金融/政务场景
BGE系列(如BAAI/bge-m3)★★★☆☆利用其multi-representation能力,将boundary detection结果作为额外query输入多粒度检索(段落+句子+关键词)
OpenAI text-embedding-3★★☆☆☆无法修改模型内部,需用API分段调用+后处理对齐快速验证POC,不追求极致精度

以我们落地最多的nomic-embed-text-v1.5为例,核心改造代码如下(已脱敏生产环境配置):

# 修改modeling_nomic.py中的NomicBertModel.forward() def forward( self, input_ids: torch.LongTensor, attention_mask: Optional[torch.Tensor] = None, position_ids: Optional[torch.LongTensor] = None, output_hidden_states: bool = False, return_dict: bool = True, late_chunking: bool = True, # 新增参数 boundary_threshold: float = 0.35, # 边界检测阈值 ): # ... 前向传播至第14层(共24层) hidden_states = self.encoder.layer[13](hidden_states, attention_mask) if late_chunking: # Stage 2:在hidden_states上执行边界检测 boundaries = self._detect_boundaries(hidden_states, attention_mask, boundary_threshold) # Stage 3:仅对语义段落进行后续编码 final_vectors = [] for start, end in boundaries: segment = hidden_states[:, start:end, :] # 将segment送入剩余10层 segment_out = self._encode_segment(segment, attention_mask[:, start:end]) final_vectors.append(segment_out) return {"vectors": final_vectors, "boundaries": boundaries} # 原始Early Chunking路径 pooled_output = self.pooler(hidden_states) if self.pooler is not None else None return BaseModelOutputWithPooling( last_hidden_state=hidden_states, pooler_output=pooled_output, )

其中_detect_boundaries()函数实现梯度法检测:

def _detect_boundaries(self, hidden_states, attention_mask, threshold): # 计算相邻token的余弦距离变化率 cos_sim = F.cosine_similarity( hidden_states[:, :-1, :], hidden_states[:, 1:, :], dim=-1 ) # shape: [batch, seq_len-1] # 检测距离突增点(一阶差分) diff = torch.diff(cos_sim, dim=1) # shape: [batch, seq_len-2] # 找到diff < -threshold的位置(距离突然变大) boundary_mask = (diff < -threshold).nonzero(as_tuple=True) # 合并邻近边界(避免过度切分) boundaries = [] for batch_idx in torch.unique(boundary_mask[0]): pos = boundary_mask[1][boundary_mask[0]==batch_idx] # 贪心合并:若两边界距离<32,则视为同一边界 merged = [] for p in pos: if not merged or p - merged[-1] > 32: merged.append(p.item()) boundaries.extend([(p, p+128) for p in merged]) # 默认段落长度128 return boundaries

注意:这段代码中的128不是随意设定。我们通过在WikiText-103数据集上做消融实验发现,当语义段落长度在96~160 token区间时,下游检索任务的MRR@10提升最显著(+15.3%),且GPU显存占用增幅可控(+18%)。小于96会丢失上下文,大于160则重新陷入Early Chunking的稀释困境。

3.2 边界检测模块的工业级调优技巧

在真实业务场景中,边界检测的准确性直接决定Late Chunking的成败。我们总结出三条必须现场调试的经验:

技巧1:动态阈值适配文档类型
固定阈值(如0.35)在混合文档中表现极差。正确做法是为每类文档训练轻量级分类器,预测最优阈值:

  • 技术文档(含代码/公式):阈值设为0.28~0.32(语义变化更平缓)
  • 法律合同:阈值设为0.38~0.45(条款间逻辑跳跃大)
  • 新闻报道:阈值设为0.33~0.37(导语-主体-结尾结构清晰)
    我们在某省级政务知识库项目中,用仅200条标注样本训练了一个3层MLP分类器,将阈值预测误差从±0.11降至±0.03,使关键条款召回率提升21.6%。

技巧2:注意力熵与梯度法的交叉验证
单一方法易受噪声干扰。例如技术文档中的代码块会大幅拉低梯度法的检测灵敏度,而新闻标题的短句又会让熵值法产生大量伪边界。我们的解决方案是:

  • 先用梯度法生成候选边界集A
  • 再用熵值法生成候选边界集B
  • 取A∩B作为最终边界(交集),并用A∪B作为备选池
  • 在检索阶段,若主边界向量匹配失败,自动回退到备选池中最近的边界向量
    这套机制使某医疗问诊系统的误切率从12.7%降至3.2%。

技巧3:边界位置的亚像素级校准
模型检测出的边界(如token 1245)往往不是最佳切分点。我们发现,在边界前后±16 token窗口内,存在一个“语义平稳区”——此处token的hidden state方差最小。通过计算该窗口内各位置的方差,选择方差最小点作为最终切分位。在某专利分析项目中,此校准使权利要求书与说明书的向量分离度提升39.8%,显著改善侵权比对精度。

3.3 端到端部署架构与性能压测

Late Chunking绝非仅修改几行代码就能上线。其生产环境需重构整个Embedding流水线。我们采用的经过千次压测验证的架构如下:

graph LR A[原始长文档] --> B[预处理服务] B --> C{文档类型识别} C -->|法律| D[加载法律专用阈值模型] C -->|技术| E[加载技术专用阈值模型] D & E --> F[长文本编码服务] F --> G[边界检测GPU节点] G --> H[语义段落提取] H --> I[向量生成GPU节点] I --> J[向量索引服务] J --> K[FAISS/HNSW索引] K --> L[线上检索API]

关键性能指标(基于A100 80G实测):

  • 吞吐量:单节点每秒处理12.4个8K-token文档(Early Chunking为28.7个,但Late Chunking产出向量质量更高)
  • 延迟:P95延迟1.82s(含网络传输),其中边界检测占43%,向量生成占38%
  • 显存占用:峰值显存14.2GB(Early Chunking同配置下为8.9GB,但需额外存储2.3倍向量)
  • 索引体积:相同文档集,Late Chunking生成向量数减少57%,FAISS索引体积下降63%

实操心得:很多团队卡在“向量生成GPU节点”这一步。错误做法是让每个语义段落都走完整模型。正确做法是复用Stage 1的hidden_states,仅对段落对应的hidden_states切片送入剩余层——这能节省68%的GPU计算。我们曾因忽略这点,在某项目中多花了42万元的云服务费。

4. 场景化效果验证与避坑指南

4.1 五大典型场景的实测效果对比

我们在真实客户环境中对Late Chunking进行了跨领域压力测试,所有数据均来自生产环境脱敏日志。以下是关键指标对比(Baseline为Early Chunking + 512-token chunk):

应用场景文档特征MRR@10提升关键片段召回率向量存储节省典型问题解决案例
金融研报分析含图表描述、多空观点交织+24.1%+31.7%52%准确区分“维持增持”与“首次覆盖”评级逻辑
法律合同审查条款嵌套深、但书密集+38.9%+45.2%59%完整捕获“甲方违约→乙方免责→第三方追偿”链条
学术论文检索摘要/引言/方法/结论结构化+19.3%+26.8%47%将“实验结果表明”与后文数据强关联
医疗病历归档主诉/现病史/既往史混排+33.6%+39.4%61%精准分离“患者自述症状”与“医生诊断结论”
技术标准解读术语定义、引用标准、实施要求交织+27.5%+35.1%55%正确关联“GB/T 19001-2016第8.5.2条”与具体操作步骤

特别值得强调的是法律合同审查场景。某律所使用Early Chunking时,对“不可抗力”条款的检索,常将“地震、海啸”等自然灾害定义与“政府政策调整”等商业风险混为一谈。Late Chunking通过识别出“但下列情形除外”这一语义边界,将整个但书条款(含所有例外情形)作为一个完整单元编码,使例外情形的向量与主条款向量在余弦空间中保持合理距离(0.62 vs Early Chunking的0.38),从而在检索时能精准返回“哪些情形不构成不可抗力”。

4.2 生产环境十大高频问题与根因排查

在23个Late Chunking落地项目中,我们记录了所有导致上线失败的问题。以下是TOP10及其可复用的排查路径:

问题编号现象描述根本原因快速验证方法解决方案
Q1边界检测结果为空文档过短(<256 token)或全为停用词检查input_ids长度及attention_mask中1的比例增加最小长度保护:len<256时强制返回[0,len]
Q2同一文档生成向量数波动剧烈动态阈值模型预测偏差对比阈值预测值与实际cos_sim分布加入阈值平滑:moving average over last 5 docs
Q3GPU显存OOM未启用FlashAttention-2或序列并行运行nvidia-smi -l 1实时监控显存强制启用flash_attn2,设置max_seq_len=8192
Q4检索结果出现大量重复段落语义边界重叠(如[120,180]与[170,230])检查boundaries列表是否有重叠区间添加边界去重逻辑:merge overlapping intervals
Q5中文长句切分不准RoPE位置编码对中文token间距敏感可视化hidden_states中相邻中文token距离改用ALiBi位置编码(已验证提升12.3%)
Q6法律条款向量相似度异常高“甲方”“乙方”等泛化代词主导表征对hidden_states做PCA,观察前3主成分在边界检测后,对段落向量做代词掩码(mask pronouns)
Q7API响应延迟突增至10s+边界检测模块CPU过载(非GPU)top -H查看python进程线程CPU占用将边界检测移至专用CPU节点,用gRPC异步调用
Q8混合文档(中英+代码)切分混乱多语言tokenization未对齐检查tokenizer.encode()输出的token ids统一使用sentencepiece tokenizer,禁用fast tokenizer
Q9向量索引构建失败语义段落长度方差过大(从32到2048)统计boundaries中end-start的分布增加段落长度裁剪:max_len=512, min_len=64
Q10线上QPS下降50%向量生成节点未做连接池复用netstat -an | grep :8080 | wc -l在客户端启用HTTP/2连接池,max_connections=200

实操心得:Q5(中文长句问题)是我们踩过最深的坑。某政务项目上线后,用户反馈“政策依据”条款总被错误关联到无关文件。排查三天才发现,原模型使用的RoPE对中文字符间距建模存在系统性偏差——因为中文token平均长度是英文的1.8倍,导致位置编码的旋转角度计算失真。最终解决方案不是换模型,而是在RoPE计算前,对中文token的position_id做动态缩放(scale = 1.0 / avg_chinese_token_length),这个0.3行的代码修改,让政策条款召回率从63.2%跃升至89.7%。

4.3 不适合Late Chunking的三类场景预警

Late Chunking虽强大,但并非万能。我们在实践中明确划出三条红线,凡触及必返工:

红线1:超细粒度检索需求
若业务要求精确到“单个技术参数”(如“工作温度:-40℃~85℃”中的“85℃”),Late Chunking的语义段落(通常≥96 token)会包含过多冗余信息,反而降低匹配精度。此时应采用Early Chunking + NER实体抽取的组合方案。某芯片规格书项目曾因此返工,最终用spaCy识别出所有数值型参数,再对参数周围50字符做Early Chunking,MRR@10达92.4%(Late Chunking仅76.1%)。

红线2:实时性要求极高(<100ms)
Late Chunking的边界检测+分段编码必然增加延迟。若场景是高频交易中的实时舆情监控(要求单文档<50ms处理),必须回归Early Chunking,并用量化(INT4)+ TensorRT加速。我们曾为某券商定制INT4版bge-m3,Early Chunking延迟压至38ms,而Late Chunking最低只能做到127ms。

红线3:文档结构极度不规则
如扫描版PDF经OCR后的文本,存在大量乱码、错行、缺失标点。Late Chunking依赖的cosine similarity和attention entropy在此类噪声下会失效。某古籍数字化项目就因此失败,最终改用规则引擎:先用正则识别“卷X”“第X章”等结构标记,再按标记切分。

这三条红线不是技术缺陷,而是对问题边界的清醒认知。真正的专业,不在于炫技,而在于知道何时该用什么工具。

5. 进阶实践:从单文档到跨文档语义对齐

5.1 跨文档Late Chunking:构建知识图谱的基石

当Late Chunking能力成熟后,真正的价值爆发点在于跨文档语义对齐。传统RAG中,不同文档的“违约责任”条款向量可能因表述差异(如“甲方应赔偿”vs“乙方有权索赔”)而分散在向量空间不同角落。Late Chunking提供了一种新思路:

Step 1:对每个文档独立执行Late Chunking,获得各自语义段落集合{S₁¹, S₁², ..., S₁ⁿ},{S₂¹, S₂², ..., S₂ᵐ}...

Step 2:在段落向量空间中,构建跨文档相似度图

  • 计算所有段落向量的pairwise余弦相似度
  • 对每对高相似度段落(sim>0.75),提取其共现关键词(TF-IDF top3)
  • 将段落作为节点,共现关键词作为边标签,构建异构图

我们在某跨国律所项目中,用此方法处理127份不同法域的隐私政策,自动发现“数据主体权利”这一概念在GDPR、CCPA、PIPL中的23种表述变体,并生成标准化映射表。这直接支撑了其全球合规自动化审查系统。

5.2 Late Chunking与LLM的协同增强

Late Chunking不应孤立存在。我们验证了两种与大模型的深度协同模式:

模式A:Late Chunking作为LLM的“前置记忆过滤器”
在RAG中,不直接将检索到的段落喂给LLM,而是:

  • 对检索段落再次执行Late Chunking,提取其最核心的子句(如法律条款中的“但书”部分)
  • 将子句+原始段落上下文拼接,作为LLM输入
    实测显示,某合同审核场景的幻觉率从18.3%降至4.7%,且LLM输出长度减少32%(因无需再“猜”上下文)。

模式B:用LLM反哺Late Chunking边界检测
当边界检测模块在某类文档上持续不准时,可:

  • 将文档+疑似边界位置送入LLM(如Qwen2-7B),prompt:“请判断token X是否为新语义单元的开始?请输出YES/NO及理由”
  • 收集100条LLM判断,微调边界检测模型
    我们在某医学指南项目中,用此方法将罕见病诊疗条款的边界识别F1值从0.61提升至0.89。

最后分享一个细节:所有这些进阶玩法,都建立在一个基础之上——Late Chunking必须输出带元数据的向量。我们强制要求每个向量附带:doc_id,start_pos,end_pos,boundary_confidence,segment_type(如"definition", "procedure", "exception")。没有这些元数据,跨文档对齐和LLM协同都是空中楼阁。这个习惯,让我们在后续所有项目中节省了平均200人时的数据清洗工作。

我在实际部署中发现,Late Chunking最迷人的地方,不在于它多聪明,而在于它多“诚实”。它不会假装能完美处理一切长文本,而是坦率告诉你:“这部分我理解得深,这部分我建议你另找专家”。这种对能力边界的清醒认知,恰恰是构建可靠AI系统的起点。当你下次面对一份50页的招标文件时,不妨先问问自己:我是想把它切成碎片扔给模型,还是邀请模型一起,慢慢读懂它的呼吸节奏?

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

uni-app实战:5步搞定高德地图电子围栏(多边形)从绘制、编辑到数据回传的完整业务闭环

uni-app实战&#xff1a;高德地图电子围栏全流程开发指南在物流配送、共享出行、零售服务等业务场景中&#xff0c;电子围栏技术正成为地理围栏管理的核心解决方案。通过uni-app框架集成高德地图API&#xff0c;开发者可以快速构建跨平台的电子围栏功能模块。本文将深入讲解从地…

作者头像 李华
网站建设 2026/6/14 8:20:31

深度解析 Onyx:当企业级 AI 搜索遇上时序预测大模型 TimesFM

深度解析 Onyx&#xff1a;当企业级 AI 搜索遇上时序预测大模型 TimesFM 在当今快速演进的技术 landscape 中&#xff0c;开源社区正以前所未有的速度推动着人工智能的边界。作为开发者&#xff0c;我们每天都能在 GitHub 上见证各种新星升起。近期&#xff0c;一个名为 onyx-d…

作者头像 李华
网站建设 2026/6/14 8:16:32

GHelper完整指南:如何用轻量级工具完美控制华硕笔记本性能

GHelper完整指南&#xff1a;如何用轻量级工具完美控制华硕笔记本性能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook…

作者头像 李华
网站建设 2026/6/14 8:16:26

卷积神经网络核心原理:从局部感知到层级抽象

1. 项目概述&#xff1a;为什么“概念先于代码”是神经网络学习的真正起点你有没有试过打开一份PyTorch教程&#xff0c;第一行就是import torch.nn as nn&#xff0c;接着堆满nn.Linear、nn.ReLU、nn.Conv2d&#xff0c;然后告诉你“运行这段代码&#xff0c;你就能训练一个CN…

作者头像 李华