1. 这不是“AI名词解释大全”而是一份技术人用得上的国庆扫盲地图“AI概念大全技术人的国庆7天扫盲指南”——看到这个标题我第一反应不是去翻教科书而是打开终端敲了两行命令git clone https://github.com/ai-lexicon/ai-glossary和make build-pdf。结果发现90%的所谓“AI术语手册”要么是把维基百科词条复制粘贴成PDF要么堆砌一堆“大模型”“Transformer”“RLHF”之类的词配上三行百度百科式定义再加个“通俗易懂”的虚假承诺。真正写代码、调参、部署模型的人根本没法靠它解决手头那个报错CUDA out of memory却查不到原因的线上服务也搞不清为什么同事说“我们用LoRA微调”而你连LoRA到底在改哪几层权重都不知道。这份指南是我过去三年在三家AI基建团队、两个大模型应用项目里一边修线上bug一边整理出来的“概念-问题-动作”映射表。它不按字母顺序排也不追求学术严谨性而是按技术人真实工作流中的认知路径来组织你今天遇到一个需求比如“让客服机器人能理解方言”明天要选型该用RAG还是微调后天调试失败embedding维度对不上大后天要和产品讲清楚为什么“准确率95%”可能毫无意义。每一个概念都绑定一个具体场景、一个典型错误、一个可验证的动作。比如“Token”这个词我不告诉你“它是语言模型处理的最小单位”而是告诉你“当你看到input length exceeded max_position_embeddings2048报错时打开你的tokenizer运行len(tokenizer.encode(今天天气真好))数一数返回值是多少——这个数字就是你正在被卡住的真实瓶颈。”它专为国庆七天设计不是因为假期要学多少东西而是因为这七天是你唯一能脱离KPI、静下心来补认知地基的时间。每天聚焦一个核心认知模块Day1搞清“AI不是魔法是工程流水线”Day2拆解“数据怎么从脏乱差变成模型能吃的‘精饲料’”Day3直面“模型不是黑箱是可调试的参数集合”Day4厘清“推理不是‘跑一下就行’是内存、显存、延迟的精密平衡术”Day5看透“评估不是算个accuracy是设计对抗样本测鲁棒性”Day6实战“用30行代码把一个开源模型接入你自己的业务逻辑”Day7收束“如何用一句话向老板说清技术方案的风险与边界”。没有PPT式概括只有你能立刻执行的检查清单、能马上验证的命令行、能当场复现的bug案例。如果你正被“大模型”“AIGC”“Agent”这些词绕晕或者每次听技术分享都像在听外语——这份指南就是给你配的实时翻译器。2. 概念扫盲的本质重建技术人的“问题定位坐标系”2.1 为什么90%的AI概念学习是无效的我见过太多工程师花两周啃完《深度学习》前五章结果第一次部署BERT模型时在pip install transformers之后卡在OSError: libcudnn.so.8: cannot open shared object file上整整一天。问题不在他不懂反向传播而在于他的知识图谱里根本没有“CUDA版本”“cuDNN版本”“PyTorch编译时链接的动态库”这三个节点更别说它们之间的依赖箭头。AI领域的概念从来不是孤立存在的名词而是一张强耦合的技术栈关系网。把“Attention”单独拎出来讲就像只告诉你“汽车有方向盘”却不提转向系统、液压助力、ECU信号解析——你永远不知道为什么打方向时车头不转。真正的扫盲是建立一套问题定位坐标系。这个坐标系有三个轴X轴输入-处理-输出的数据流路径数据从哪里来经过哪些模块中间形态是什么Y轴软硬件资源约束带CPU/GPU型号显存大小内存带宽网络延迟Z轴业务目标与技术指标的映射关系“响应快”对应P99延迟300ms“准确”对应F1-score0.85还是对抗样本下的鲁棒准确率当你听到“RAG”这个词有效学习方式不是背诵“Retrieval-Augmented Generation”而是立刻在坐标系里定位它在X轴上位于“用户Query → 向量检索 → 检索结果拼接 → LLM生成”这一段Y轴上它把部分计算压力从GPULLM推理转移到CPU向量检索和内存向量数据库Z轴上它牺牲了端到端训练的灵活性换取了对私域知识的即时更新能力。这样当产品提需求“让机器人知道公司最新报销政策”你脑子里自动弹出的不是“RAG很火”而是“我们需要一个向量数据库Y轴资源、一份政策PDF切片后的embeddingX轴数据流、以及LLM prompt里插入检索结果的模板Z轴指标映射”。2.2 “技术人”视角下的概念分层从物理层到语义层很多AI科普把概念全塞进“算法层”这是最大的误导。技术人日常打交道的至少有四层层级典型概念技术人日常接触点常见误解物理层GPU显存、PCIe带宽、NVLink、FP16/INT8精度nvidia-smi看到的显存占用、watch -n 1 cat /proc/meminfo | grep MemFree监控内存、量化时选择--quantize int8“显存不够就换A100”忽略PCIe带宽瓶颈、“INT8更快所以全用INT8”忽略精度损失导致的bad case激增系统层CUDA Context、NCCL通信、TensorRT引擎、vLLM的PagedAttention启动服务时的CUDA_VISIBLE_DEVICES0,1、分布式训练报错NCCL version mismatch、trtexec --onnxmodel.onnx编译引擎“多卡训练就是加--nproc_per_node2”忽略NCCL拓扑配置、“vLLM比HuggingFace快”忽略其依赖的特定kernel优化框架层PyTorch的Autograd、TensorFlow的Graph Execution、JAX的jit编译torch.no_grad()上下文管理、tf.function装饰器、jax.jit注解“Autograd自动求导所以不用管梯度”忽略retain_graphTrue的内存泄漏、“JAX函数纯函数所以安全”忽略random.PRNGKey状态传递语义层Token、Embedding、Logits、Temperature、Top-p采样tokenizer.encode()返回的id列表、model(input_ids).last_hidden_state形状、logits.softmax(dim-1)后取argmax、生成时设置temperature0.7“Token就是字”中文里一个字常对应多个token、“Embedding是词向量”实际是上下文相关的hidden state、“Temperature越低越确定”忽略其与top-p的交互效应这份指南的全部内容都锚定在这四层结构上。比如讲“LoRA”不会只说“低秩自适应”而是明确指出它在系统层修改了PyTorch的nn.Linear模块在框架层注入了forward钩子在物理层节省了GPU显存因只存两个小矩阵而非整个权重矩阵在语义层影响了LoRA权重更新时的梯度传播路径。你学到的不是一个词而是一个可操作的“修改点”。2.3 国庆七天的设计逻辑用“最小闭环”对抗认知过载人脑处理新概念的极限是每天吸收3-5个可验证、可关联、可迁移的知识单元。所谓“可验证”是指你能用一行命令或一段代码立刻看到效果“可关联”是指它能自然连接到你昨天学的概念或上周写的代码“可迁移”是指它能直接用在你手头的项目里哪怕只是改一行配置。七天安排严格遵循这个认知规律Day1破除“AI神秘主义”——用python -c print(2**10)和nvidia-smi对比建立“算力是物理资源”的直觉用wget下载一个10MB的模型bin文件ls -lh看大小sha256sum验证完整性理解“模型即数据文件”。Day2数据即燃料——用pandas.read_csv(data.csv)读原始数据df.describe()看分布df.isnull().sum()找缺失值sklearn.preprocessing.LabelEncoder做简单编码亲手感受“脏数据”如何一步步变成torch.tensor。Day3模型即参数容器——用torch.load(model.pth, map_locationcpu)加载模型print(model.state_dict().keys())看有哪些层print(model.state_dict()[lm_head.weight].shape)查输出层维度model.eval(); with torch.no_grad(): out model(input_ids)执行一次前向传播。Day4推理即资源调度——用time python infer.py测延迟nvidia-smi看显存峰值ps aux \| grep python查进程内存strace -p $(pgrep python) -e tracememory抓内存分配把“推理慢”从玄学变成可测量的指标。Day5评估即风险测绘——不只算accuracy用scikit-learn.metrics.classification_report看各类别precision/recall用textattack跑对抗攻击测试鲁棒性用alibi-detect查输入数据漂移。Day6集成即胶水编程——用Flask写一个/predict接口接收JSON输入调用本地模型返回JSON结果用curl -X POST http://localhost:5000/predict -d {text:hello}测试加一行logging.info(fRequest: {request.json})埋点。Day7沟通即翻译能力——把“我们用了Qwen2-7B-Int4量化模型P99延迟210ms支持10并发”翻译成老板听得懂的话“客服机器人响应速度比人工快3倍同时处理10个客户咨询不卡顿模型体积缩小60%便于部署到边缘设备”。每一天你都能完成一个从概念理解→动手验证→问题定位→结果输出的最小闭环。七天后你手里不是一堆零散名词而是一套随时能调用的“技术诊断工具包”。3. 核心概念深度拆解每个词背后都藏着一个待解决的Bug3.1 Token不只是“分词”而是模型理解世界的像素单位“Token”这个词被严重低估了。很多人以为它就是“把句子切分成词”但实际它是模型感知和操作语言的最小不可分割单元其粒度直接决定了模型的表达能力和计算开销。举个最直观的例子用Hugging Face的tokenizer处理同一句话from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(bert-base-chinese) text 我喜欢吃苹果 print(原始文本:, text) print(分词结果:, tokenizer.tokenize(text)) print(Token ID:, tokenizer.encode(text, add_special_tokensFalse)) print(Token数量:, len(tokenizer.encode(text)))输出可能是原始文本: 我喜欢吃苹果 分词结果: [我, 喜, 欢, 吃, 苹, 果] Token ID: [100, 123, 245, 367, 489, 501] Token数量: 6但换成tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2-0.5B-Instruct)结果会完全不同分词结果: [我, 喜欢, 吃, 苹果] Token ID: [123, 456, 789, 1011] Token数量: 4差异在哪BERT用的是基于字的分词WordPiece每个汉字独立成tokenQwen2用的是基于子词的分词Byte-Pair Encoding把高频组合“喜欢”合并为一个token。这意味着存储成本同样一句话BERT需要6个token embedding向量Qwen2只需4个显存占用降低33%语义捕获“喜欢”作为一个整体token比分开的“喜”“欢”更能保留固定搭配的语义OOV未登录词处理遇到“苹果手机”BERT可能切为[苹,果,手,机]丢失“苹果”作为品牌名的含义BPE则可能已有苹果手机这个token直接命中。提示tokenizer.encode()返回的ID列表长度就是模型输入序列的实际长度。max_length512不是指512个字而是512个token。当你看到Input length exceeds maximum length报错第一反应不应该是“删文字”而是print(len(tokenizer.encode(long_text)))确认真实token数并检查tokenizer是否用了正确的truncationTrue, paddingTrue参数。实操中我踩过的最大坑是跨模型tokenizer混用。曾有个项目前端用bert-base-chinesetokenizer分词后端模型却是roberta-wwm-ext。表面看都是中文BERT但roberta-wwm-ext的vocab.txt里“的”字ID是1234而bert-base-chinese里是5678。结果前端传来的ID序列后端模型当成完全不同的字符解码输出全是乱码。解决方案极其简单所有环节必须使用同一个tokenizer实例且其from_pretrained路径必须与模型路径严格一致。3.2 Embedding不是“向量”而是高维空间里的“语义坐标”“Embedding”常被简化为“把词变成向量”这掩盖了它最核心的价值将离散符号映射到连续、可计算、具几何意义的语义空间。想象一下把所有中文词放在一个1024维的超立方体里相似的词如“猫”和“狗”距离近“猫”和“冰箱”距离远。模型训练的目标就是不断调整这个空间的结构让下游任务如分类、生成在这个空间里变得简单。关键细节在于Embedding层的位置和作用在BERT类模型中word_embeddings层接收token ID输出[batch_size, seq_len, hidden_size]的tensor这是所有后续计算的起点在LLM中model.embed_tokens层不仅做token embedding还常与position_embeddings相加注入位置信息在RAG系统中encoder模型如bge-large-zh-v1.5的输出就是query和document的embedding它们被送入向量数据库进行最近邻搜索。一个经典误区是认为“embedding越大越好”。实际上embedding维度d直接影响内存占用一个[1000, 1024]的float32 tensor占1000*1024*44MB显存计算量Attention计算复杂度为O(n²d)d翻倍计算量也翻倍泛化能力过大的d容易过拟合尤其在小数据集上。我实测过在一个电商评论情感分析任务中把BERT的hidden_size768改为1024训练速度下降40%验证集F1反而从0.87降到0.85。原因是模型把更多容量花在记忆训练集噪声上而非学习泛化特征。Embedding维度的选择本质是在“表达能力”和“计算效率”之间做工程权衡而非单纯追求更高。注意model.get_input_embeddings()返回的embedding层其weight参数形状是[vocab_size, hidden_size]。当你想查看某个词的embedding不要用tokenizer.convert_tokens_to_ids(苹果)再索引而应直接embedding_layer.weight[token_id]。因为convert_tokens_to_ids可能返回-1未登录词而weight索引越界会直接报错更早暴露问题。3.3 Logits不是“输出”而是模型“未经校准的原始判断”Logits是模型最后一层线性变换的输出是未经过softmax归一化的原始分数。很多人直接torch.argmax(logits, dim-1)取预测类别这没问题但若想看“模型有多自信”必须用logits.softmax(dim-1)。这里藏着一个致命陷阱Logits的绝对值大小没有意义只有相对大小决定分类结果。举个例子假设模型输出logits为[2.1, 5.3, 1.8]softmax后是[0.04, 0.89, 0.07]模型“非常确信”是第二类。但如果logits是[21.0, 53.0, 18.0]softmax后仍是[0.04, 0.89, 0.07]——数值放大10倍概率分布完全不变。这是因为softmax公式exp(x_i) / sum(exp(x_j))具有尺度不变性。那为什么还要关注logits因为温度系数Temperature调节softmax(logits / T)T1使分布更平滑降低置信度T1使分布更尖锐提高置信度。生成任务中常用T0.7避免重复Top-k和Top-p采样top_k50表示只从logits最高的50个token中采样top_p0.9表示累积概率达0.9的最小token集合。它们都直接操作logits知识蒸馏教师模型的logitssoft targets比hard labelsargmax结果包含更多信息用于指导学生模型。我在一个医疗问答项目中发现模型对“糖尿病”相关问题的logits普遍偏低平均值-3.2而对“感冒”问题高达4.1。这不是模型不准而是训练数据中“感冒”样本远多于“糖尿病”导致logits分布偏移。解决方案不是调learning rate而是在loss计算前对logits做per-class bias correction为“糖尿病”类加一个2.0的偏置项让其logits回归到合理范围。这比重新采样数据快得多。3.4 Attention不是“注意力机制”而是“动态权重计算器”Attention常被神化为“模仿人类注意力”其实它就是一个可学习的、基于查询Query的加权求和操作。核心公式Attention(Q,K,V) softmax(QK^T / sqrt(d_k)) * V拆解来看QQuery当前要生成的token的“提问”KKey所有历史token的“标签”VValue所有历史token的“内容”QK^T计算当前token与每个历史token的“相关性得分”softmax把得分转成0-1之间的权重总和为1* V用权重加权求和所有历史内容得到当前token的上下文表示。关键洞察Attention不是“记住所有信息”而是“根据当前需求动态选择最相关的信息”。这解释了为什么长文本模型会“遗忘”开头内容——不是模型坏了而是开头token的K与当前Q的点积太小softmax后权重趋近于0。一个硬核实操技巧可视化Attention权重。用transformers库的output_attentionsTrue参数获取每层的attention mapoutputs model(input_ids, output_attentionsTrue) attentions outputs.attentions # tuple of [layer][batch, head, seq_len, seq_len] # 取第一层第一个head的权重 attn_map attentions[0][0, 0].detach().numpy() # shape: [seq_len, seq_len] import matplotlib.pyplot as plt plt.imshow(attn_map, cmapviridis) plt.title(Layer 0, Head 0 Attention Weights) plt.show()你会看到一个热力图对角线亮自己关注自己靠近对角线的区域也亮关注邻近词远处暗忽略遥远词。如果发现某句话的“苹果”和结尾的“好吃”之间完全没有权重连接说明模型没学会长程依赖——这时该怀疑的不是数据而是max_position_embeddings设得太小或者用了不支持长序列的RoPE位置编码。提示sqrt(d_k)这个缩放因子绝非可有可无。当d_k64时QK^T的方差约为64softmax输入过大会导致梯度消失大部分exp值为0或inf。加上/sqrt(64)8方差回归到1梯度稳定。这是Attention能训练的基础数学保障。4. 国庆七天实操路线图每天一个可交付成果4.1 Day1建立“AI即工程”的物理直觉交付一份本地GPU资源报告目标破除“AI黑魔法”迷思建立算力是物理资源的认知。实操步骤打开终端运行nvidia-smi记录以下信息GPU型号如NVIDIA A10总显存如24576 MiB当前已用显存如1234 MiBGPU利用率如0%运行lshw -class display | grep -E (product|vendor|size)确认GPU驱动版本和PCIe连接带宽如PCIe x16 3.0。下载一个轻量模型wget https://huggingface.co/bert-base-chinese/resolve/main/pytorch_model.bin用ls -lh pytorch_model.bin查看大小约420MB。计算理论显存需求BERT-base有110M参数float32精度下参数本身占110e6 * 4 440MB加上optimizer状态Adam需3倍参数量、梯度1倍、激活值随序列长度增长训练时至少需440 * 5 ≈ 2.2GB。对比nvidia-smi的可用显存判断能否跑起来。写一份Markdown报告包含上述所有数据并结论“我的GPU可支持BERT-base的推理420MB 24GB但无法支持其全参数微调需2GB需用LoRA或梯度检查点”。避坑心得nvidia-smi显示的显存是GPU显存不是系统内存。free -h看的是RAM两者不能混用。pytorch_model.bin是模型权重但config.json和vocab.txt也是必需文件缺一不可。很多人以为“显存够就能跑”忽略了PCIe带宽瓶颈。A100的PCIe 4.0 x16带宽是64GB/s而RTX 3090的PCIe 4.0 x16也是64GB/s但前者显存带宽是2TB/s后者是1TB/s——这意味着A100在数据搬运上快一倍。4.2 Day2亲手清洗“脏数据”交付一个可复用的数据预处理脚本目标理解“数据质量决定模型上限”掌握从原始CSV到torch.tensor的完整链路。实操步骤准备一个模拟脏数据CSVdata.csv含列text, label, timestamp其中text有空值、HTML标签、多余空格label有拼写错误如pos应为positivetimestamp格式混乱2023/01/01vs01-Jan-2023。用pandas加载并探索df pd.read_csv(data.csv); df.info(); df.head()。清洗text列import re def clean_text(x): if pd.isna(x): return x re.sub(r[^], , x) # 去HTML x re.sub(r\s, , x) # 多空格变单空格 x x.strip() return x df[text_clean] df[text].apply(clean_text)标准化label列df[label] df[label].replace({pos: positive, neg: negative})。解析timestampdf[date] pd.to_datetime(df[timestamp], errorscoerce)。划分训练/测试集train_df, test_df train_test_split(df, test_size0.2, stratifydf[label])。保存清洗后数据train_df.to_csv(train_clean.csv, indexFalse)。避坑心得errorscoerce会让无法解析的时间戳变成NaT而不是报错中断。后续用df[date].isna().sum()统计缺失数决定是删除还是插值。stratify参数确保训练/测试集中各类别比例一致避免某类在测试集里完全消失。清洗脚本必须加if __name__ __main__:入口方便后续用python clean_data.py --input data.csv --output train_clean.csv封装成CLI工具。4.3 Day3解剖一个模型交付一份模型结构分析笔记目标把“模型”从抽象名词变成可触摸的Python对象。实操步骤安装依赖pip install torch transformers datasets。加载模型和tokenizerfrom transformers import AutoModel, AutoTokenizer model_name bert-base-chinese tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModel.from_pretrained(model_name)查看模型结构print(model)重点关注BertEmbeddings、BertEncoder含12层BertLayer、BertPooler。检查参数量print(sum(p.numel() for p in model.parameters()))应≈108M。输入一个句子inputs tokenizer(今天天气真好, return_tensorspt)print(inputs[input_ids].shape)→[1, 7]7个token。前向传播outputs model(**inputs)print(outputs.last_hidden_state.shape)→[1, 7, 768]。提取[CLS]向量cls_output outputs.last_hidden_state[:, 0, :]print(cls_output.shape)→[1, 768]。保存cls_output为numpynp.save(cls_vector.npy, cls_output.detach().numpy())。避坑心得AutoModel加载的是基础模型无分类头AutoModelForSequenceClassification才带下游任务头。混淆二者会导致model(**inputs)报错。return_tensorspt返回PyTorch tensortf返回TensorFlow tensor务必匹配你的框架。outputs.last_hidden_state是最后一层的输出outputs.hidden_states是所有层的输出tuple第0层是embedding最后一层是最终表示。4.4 Day4测量一次真实推理交付一份推理性能基准测试报告目标把“快/慢”从主观感受变成可测量的数字。实操步骤写一个infer.pyimport time import torch from transformers import AutoModel, AutoTokenizer model AutoModel.from_pretrained(bert-base-chinese).eval() tokenizer AutoTokenizer.from_pretrained(bert-base-chinese) texts [今天天气真好] * 100 # 100次请求 # 预热 inputs tokenizer(texts[0], return_tensorspt) with torch.no_grad(): _ model(**inputs) # 正式测试 latencies [] for text in texts: inputs tokenizer(text, return_tensorspt) start time.time() with torch.no_grad(): _ model(**inputs) end time.time() latencies.append((end - start) * 1000) # ms print(fP50: {np.percentile(latencies, 50):.2f}ms) print(fP99: {np.percentile(latencies, 99):.2f}ms)运行time python infer.py记录real/user/sys时间。同时开另一个终端运行nvidia-smi --query-gpuutilization.gpu,memory.used --formatcsv,noheader,nounits每秒刷新记录峰值显存。用ps aux --sort-%mem | head -10查内存占用。整理报告包含P50/P99延迟、峰值显存(MB)、峰值内存(MB)、CPU利用率(%)。避坑心得必须model.eval()和torch.no_grad()否则会计算梯度显存暴涨且速度变慢。首次运行包含CUDA初始化开销必须预热。time命令的real时间是端到端耗时user是CPU时间sys是系统调用时间三者之和通常大于real因多核并行。4.5 Day5设计一个靠谱的评估交付一份多维度评估结果表目标超越accuracy建立对模型能力的立体认知。实操步骤用Day2清洗好的test_clean.csv加载测试集。用Day3的模型做预测from sklearn.metrics import classification_report, confusion_matrix preds [] labels [] for _, row in test_df.iterrows(): inputs tokenizer(row[text_clean], return_tensorspt, truncationTrue, max_length128) with torch.no_grad(): outputs model(**inputs) logits outputs.last_hidden_state[:, 0, :] # [CLS] # 假设有一个简单的线性分类头 pred torch.argmax(logits classifier_weight classifier_bias) preds.append(pred.item()) labels.append(row[label])计算标准指标print(classification_report(labels, preds))。添加对抗测试用textattack攻击from textattack import Attack, recipes from textattack.models.wrappers import HuggingFaceModelWrapper wrapper HuggingFaceModelWrapper(model, tokenizer) attack Attack.load(deepwordbug, wrapper) results [] for text in test_df[text_clean].head(10): result attack.attack(text, positive) results.append(result) print(fAttack success rate: {sum(1 for r in results if r.succesful)/len(results)})输出表格指标值说明Accuracy0.85整体正确率F1-positive0.82正向样本的F1F1-negative0.88负向样本的F1对抗攻击成功率0.35模型鲁棒性P99延迟210ms响应速度避坑心得classification_report默认按字母序排序类别若你的label是[negative, positive]则0对应negative1对应positive确保target_names参数匹配。对抗攻击只测10个样本不代表全局但能快速暴露模型脆弱点如对同音字替换敏感。混淆矩阵confusion_matrix比accuracy更能揭示问题若大量negative被误判为positive说明阈值需调整。4.6 Day6部署一个API交付一个可curl调用的Flask服务目标打通“模型能力”到“业务可用”的最后一公里。实操步骤创建app.pyfrom flask import Flask, request, jsonify import torch from transformers import AutoModel, AutoTokenizer app Flask(__name__) model AutoModel.from_pretrained(bert-base-chinese).eval() tokenizer AutoTokenizer.from_pretrained(bert-base-chinese) app.route(/predict, methods[POST]) def predict(): data request.get_json() text data.get(text, ) if not text: return jsonify({error: text is required}), 400 inputs tokenizer(text, return_tensorspt, truncationTrue, max_length128) with torch.no_grad(): outputs model(**inputs) cls_vec outputs.last_hidden_state[:, 0, :] # 简单余弦相似度示例实际应接分类头 similarity torch.nn.functional.cosine_similarity( cls_vec, torch.randn(1, 768), dim1 ).item() return jsonify({similarity: round(similarity, 3)}) if __name__ __main__: