# 大模型文本分类:从原理到工程落地(含代码)
本文提出了一种基于“向量检索+大模型”的混合文本分类方案,旨在解决传统方法的三大痛点:高标注成本、低迭代灵活性和弱泛化能力。该方案采用双阶段架构:离线阶段构建标签-样本向量索引库,在线阶段通过向量检索粗筛候选标签后,利用大模型进行精准分类。技术选型推荐使用BGE-base-zh-v1.5作为句子嵌入模型,Milvus向量数据库和轻量级Qwen3大模型,在保证分类精度的同时大幅降低实现成本。工程实现
- 大模型时代,文本分类为何需要新方案?1.1 传统文本分类的三大痛点1.2 大模型带来的颠覆性突破2. 核心原理:向量检索 + 大模型的双阶段架构2.1 离线阶段:构建 “标签 - 样本” 知识索引库2.2 在线阶段:两步完成文本分类3. 技术选型:从模型到工具的最佳组合4. 工程落地:核心模块实现4.1 项目结构设计4.2 核心模块实现4.2.1 句子嵌入模型:BGE-base-zh-v1.54.2.2 检索模块:Milvus 向量检索4.2.3 大模型模块:Qwen3-0.6B/1.8B4.2.4 分类主逻辑:整合三大模块5. 工程优化6. 总结与技术趋势
文本分类作为 NLP 领域的基石任务,正随着大模型技术的发展迎来范式革新。从早期依赖人工特征的传统模型,到需要大量标注数据的 BERT 微调方案,再到如今无需训练即可快速落地的大模型方案,技术路径的每一次迭代都在解决前序方案的核心痛点。本文将系统拆解一套 “向量检索 + 大模型决策” 的混合分类方案。
- 大模型时代,文本分类为何需要新方案?
=====================
在讨论具体方案前,我们先明确传统分类方案的局限与大模型带来的突破 —— 这是理解新方案设计逻辑的关键。
1.1 传统文本分类的三大痛点
无论是 FastText、TextCNN 等早期模型,还是 BERT 系列预训练模型,都存在难以规避的问题:
- 标注成本高:微调 BERT 需数千甚至数万条标注数据才能达到理想效果,小样本场景下准确率骤降;
- 迭代灵活性差:当业务类目新增、删除或边界调整时,必须重新训练模型,从数据准备到部署需数天周期;
- 泛化能力不足:传统模型对领域外数据适应性弱,例如训练好的 “新闻分类模型” 难以直接迁移到 “电商商品分类” 场景。
1.2 大模型带来的颠覆性突破
大语言模型(LLM)具备 “规模大、适应性强、泛化能力突出” 的核心特性,恰好解决传统方案的痛点:
- 无训练高基线:无需更新模型参数,仅通过 Prompt 设计即可实现高准确率,大幅降低标注依赖;
- 少样本学习能力:借助 In-Context Learning(上下文学习),给少量示例就能理解新类目,类目调整无需重训;
- 跨领域适配性:预训练阶段吸收的海量通用知识,使其在新闻、电商、医疗等多领域均有良好表现。
尤其值得关注的是大模型的 “涌现能力”—— 当模型参数量达到十亿级以上时,会突然具备复杂语义理解、多步推理等小模型不具备的能力,这为文本分类的 “精准决策” 提供了基础。
- 核心原理:向量检索 + 大模型的双阶段架构
========================
这套方案的设计思路可概括为 “先粗筛、再精判”,通过向量检索解决大模型 “上下文过载” 问题,再借助大模型的推理能力实现精准分类。其本质是融合了 “检索式分类” 与 “In-Context Learning”(上下文学习)的优势,具体分为离线准备与在线推理两大阶段。
2.1 离线阶段:构建 “标签 - 样本” 知识索引库
类比 KNN 算法的 “训练过程”,我们需要提前完成三类核心工作:
- 标签体系梳理:明确每个类目的定义及边界差异,例如 “财经 - 财经” 涵盖宏观经济,而 “证券 - 股票” 聚焦股市动态,避免类目混淆;
- 样本数据准备:为每个类目匹配典型文本样本(如 “茅台股价创新高” 属于 “证券 - 股票”),样本质量直接影响后续检索精度;
- 向量索引构建:
- 用句子嵌入模型(如 BGE、ESimCSE)将 “标签描述 + 样本文本” 转化为高维向量;
- 采用向量数据库(如 Milvus、FAISS)构建索引,支持快速相似性检索。
这里的关键是向量质量,使用 BGE-base-zh-v1.5 作为嵌入模型,比传统 SimCSE 的检索召回率更高。
2.2 在线阶段:两步完成文本分类
当收到待分类文本(Query)时,系统通过以下流程输出结果:
- 向量召回(粗筛):
- 将 Query 转化为向量,在离线索引库中检索 Top 5~10 个相似的 “样本 - 标签” 对;
- 目的是缩小候选标签范围,避免大模型面对数百个类目时 “注意力分散”,同时缩短 Prompt 长度。
- 大模型决策(精判):
- 将 “召回的相似样本 + 标签定义” 嵌入 Prompt,引导大模型基于上下文学习做出判断;
- 加入 “拒识” 规则:若 Query 不属于任何候选标签或语义模糊,返回 “拒识”,避免错误分类。
架构优势验证:有数据显示,该方案在 ICL(上下文学习)模式下准确率达 94%,仅比 BERT 微调低 4%,但实现成本降低 80%;若不使用 ICL,准确率降至 88%,证明 “检索 + 示例” 对性能的关键作用。
- 技术选型:从模型到工具的最佳组合
===================
方案落地的核心是选择适配的技术组件,需平衡 “准确率、速度、成本” 三大要素。推荐以下选型:
| 模块 | 推荐选型 | 选型理由 |
|---|---|---|
| 句子嵌入模型 | BGE-base-zh-v1.5(优于 SimCSE) | 中文语义匹配精度高,开源免费,支持长文本(512token),向量维度 768 |
| 向量数据库 | Milvus(或 FAISS 轻量版) | Milvus 支持分布式部署,亿级数据检索延迟 < 100ms,支持 HNSW/IVF 等索引 |
| 大模型基座 | Qwen3-0.6B/1.8B | 轻量化,部署成本极低(显存需求 4 - 8GB),指令遵循能力满足基础分类需求 |
| 可视化工具 | SwanLab | 实时监控训练 / 推理过程,支持准确率、召回率等指标可视化 |
特别说明:若业务场景对成本敏感,可使用 FAISS 替代 Milvus(轻量无服务依赖);若需更高准确率,可升级为 QWen2-7B-Instruct(需 24GB 显存)。
- 工程落地:核心模块实现
==============
4.1 项目结构设计
.
├── configs # 配置文件(模型路径、Prompt模板等)
│ └── text_cls_config.py # 分类任务专属配置
├── dataset # 数据目录(符合行业命名习惯)
│ ├── vector_index # 向量索引文件(Milvus/FAISS)
│ └── label_data # 标签定义与样本数据
│ ├── label_def.json # 标签定义(如{"财经-财经":"涵盖宏观经济..."})
│ └── sample_data.jsonl # 样本数据(每行一条,含text/label)
├── scripts # 批处理脚本(复数命名更规范)
│ ├── build_vector_index.py # 构建向量索引
│ └── run_classification_test.py # 测试脚本
└── core # 核心代码(替代原src,结构更清晰)
├── text_classifier.py # 分类器主逻辑
├── models # 模型封装
│ ├── embedding # 句子嵌入模型(BGE)
│ └── llm # 大模型(QWen3)
├── retriever # 检索模块
└── tools # 工具函数(数据处理、日志等)
4.2 核心模块实现
4.2.1 句子嵌入模型:BGE-base-zh-v1.5
BGE 模型在中文语义匹配任务上表现更优,此处封装为通用嵌入工具,支持向量生成与相似度计算:
import torch
from transformers import AutoModel, AutoTokenizer
from typing import List
class BGEEmbeddingModel:
"""BGE句子嵌入模型封装,支持文本向量化与相似度计算"""
def __init__(self, model_path: str = "BAAI/bge-base-zh-v1.5", device: str = "auto"):
# 自动选择设备(GPU优先)
self.device = torch.device(
"cuda" if torch.cuda.is_available() else "cpu"
) if device == "auto" else torch.device(device)
# 加载模型与Tokenizer
self.tokenizer = AutoTokenizer.from_pretrained(model_path)
self.model = AutoModel.from_pretrained(model_path).to(self.device).eval()
# BGE专用Prompt(提升语义匹配精度)
self.query_prefix = "为文本生成语义向量:"
def _mean_pooling(self, model_output, attention_mask):
"""BGE推荐的Mean Pooling方式,提取句子向量"""
token_embeddings = model_output[0] # 取最后一层隐藏态
input_mask = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
return torch.sum(token_embeddings * input_mask, 1) / torch.clamp(input_mask.sum(1), min=1e-9)
def generate_embedding(self, text: str or List[str]) -> torch.Tensor:
"""生成单条/多条文本的向量"""
# 处理单条文本
if isinstance(text, str):
text = [text]
# 为查询文本添加专用前缀(BGE优化技巧)
text = [self.query_prefix + t for t in text]
# 文本编码
encoded_input = self.tokenizer(
text,
max_length=512,
truncation=True,
padding="max_length",
return_tensors="pt"
).to(self.device)
# 生成向量(无梯度计算,加速推理)
with torch.no_grad():
model_output = self.model(**encoded_input)
embeddings = self._mean_pooling(model_output, encoded_input["attention_mask"])
# 向量归一化(提升相似度计算精度)
embeddings = torch.nn.functional.normalize(embeddings, p=2, dim=1)
return embeddings.cpu()
def calculate_similarity(self, text1: str, text2: str) -> float:
"""计算两条文本的余弦相似度"""
vec1 = self.generate_embedding(text1)
vec2 = self.generate_embedding(text2)
return torch.nn.functional.cosine_similarity(vec1, vec2).item()
4.2.2 检索模块:Milvus 向量检索
使用 Milvus 构建检索器,支持大规模数据存储与高效召回:
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
import json
import os
from core.models.embedding.bge_model import BGEEmbeddingModel
from typing import List, Dict
class MilvusRetriever:
"""基于Milvus的向量检索器,支持样本入库、相似召回"""
def __init__(self, embedding_model: BGEEmbeddingModel):
self.embedding_model = embedding_model
self.vector_dim = 768 # BGE-base-zh-v1.5输出向量维度
self.collection = None # Milvus集合(类似数据库表)
def connect_milvus(self, host: str = "localhost", port: str = "19530"):
"""连接Milvus服务"""
connections.connect("default", host=host, port=port)
def create_collection(self, collection_name: str):
"""创建Milvus集合(含向量索引)"""
# 定义字段(id:主键,vector:向量,text:样本文本,label:标签)
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=self.vector_dim),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=2000),
FieldSchema(name="label", dtype=DataType.VARCHAR, max_length=100)
]
# 创建集合 schema
schema = CollectionSchema(fields, description="text classification sample collection")
self.collection = Collection(name=collection_name, schema=schema)
# 创建向量索引(HNSW算法,平衡速度与精度)
index_params = {
"index_type": "HNSW",
"metric_type": "IP", # 内积(适用于归一化向量)
"params": {"M": 8, "efConstruction": 64}
}
self.collection.create_index(field_name="vector", index_params=index_params)
self.collection.load() # 加载集合到内存
def batch_insert_samples(self, samples: List[Dict[str, str]], batch_size: int = 500):
"""批量插入样本(text+label)"""
if not self.collection:
raise ValueError("请先创建或加载Milvus集合")
# 分批次处理(避免单次插入数据量过大)
for i in range(0, len(samples), batch_size):
batch = samples[i:i+batch_size]
texts = [item["text"] for item in batch]
labels = [item["label"] for item in batch]
# 生成向量
vectors = self.embedding_model.generate_embedding(texts).numpy()
# 组装数据
insert_data = [vectors, texts, labels]
self.collection.insert(insert_data)
self.collection.flush() # 刷盘确保数据持久化
def retrieve_similar(self, query_text: str, top_k: int = 5) -> List[Dict[str, str]]:
"""检索与查询文本相似的样本"""
# 生成查询向量
query_vec = self.embedding_model.generate_embedding(query_text).numpy()
# 相似检索
search_params = {"metric_type": "IP", "params": {"ef": 64}}
results = self.collection.search(
data=query_vec,
anns_field="vector",
param=search_params,
limit=top_k,
output_fields=["text", "label"]
)
# 整理结果(含文本、标签、相似度)
similar_samples = []
for hit in results[0]:
similar_samples.append({
"text": hit.entity.get("text"),
"label": hit.entity.get("label"),
"similarity": hit.score # 内积分数(归一化后等价于余弦相似度)
})
return similar_samples
def load_collection(self, collection_name: str):
"""加载已存在的Milvus集合"""
self.collection = Collection(collection_name)
self.collection.load()
4.2.3 大模型模块:Qwen3-0.6B/1.8B
QWen2 系列模型在中文任务上表现优异,且显存需求低(10GB 可跑)。此处封装为分类专用接口,支持 Prompt 构建与结果解析:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
from typing import List, Dict
class QWen3TextClassifier:
"""QWen2大模型分类器,支持指令微调与零样本分类"""
def __init__(self, model_path: str, device: str = "auto", gen_params: Dict = None):
# 自动选择设备
self.device = torch.device(
"cuda" if torch.cuda.is_available() else "cpu"
) if device == "auto" else torch.device(device)
# 加载模型与Tokenizer(信任远程代码,适配QWen2)
self.tokenizer = AutoTokenizer.from_pretrained(
model_path,
trust_remote_code=True,
use_fast=False
)
self.model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.bfloat16 if self.device == "cuda" else torch.float32,
device_map="auto",
trust_remote_code=True
).eval()
# 初始化生成配置(可通过外部参数调整)
self.gen_config = self._init_generation_config(gen_params)
def _init_generation_config(self, custom_params: Dict = None) -> GenerationConfig:
"""初始化生成配置,平衡准确率与速度"""
default_config = {
"max_new_tokens": 256,
"num_beams": 2, # 束搜索提升稳定性
"do_sample": True,
"temperature": 0.6, # 降低随机性
"top_p": 0.85, # 控制生成多样性
"pad_token_id": self.tokenizer.eos_token_id,
"eos_token_id": self.tokenizer.eos_token_id
}
if custom_params:
default_config.update(custom_params)
return GenerationConfig(**default_config)
def build_classification_prompt(self,
query_text: str,
similar_samples: List[Dict],
label_defs: Dict) -> List[Dict]:
"""构建分类专用Prompt(融合相似样本与标签定义)"""
# 整理示例(In-Context Learning核心)
examples = []
candidate_labels = set()
for sample in similar_samples:
label = sample["label"]
examples.append(f"文本:{sample['text']} → 标签:{label}")
candidate_labels.add(label)
# 整理标签定义(明确边界)
label_desc = []
for label in candidate_labels:
label_desc.append(f"【{label}】:{label_defs.get(label, '无定义')}")
# 组装Prompt(遵循QWen2 Chat格式)
system_prompt = """你是专业文本分类师,需严格按以下规则分类:
1. 仅从候选标签中选择结果,每个文本对应一个标签;
2. 参考示例的分类逻辑,对比标签定义与文本语义;
3. 若文本不属于任何候选标签或语义模糊,返回"拒识"。"""
user_prompt = f"""候选标签:{','.join(candidate_labels)}
标签定义:
{chr(10).join(label_desc)}
参考示例:
{chr(10).join(examples)}
待分类文本:{query_text}
请直接输出"标签:[结果]",无需额外解释。"""
return [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
]
def predict_label(self, prompt: List[Dict]) -> str:
"""生成分类结果并解析"""
# 编码Prompt(适配QWen2格式)
encoded_input = self.tokenizer.apply_chat_template(
prompt,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt"
).to(self.device)
# 生成结果
with torch.no_grad():
outputs = self.model.generate(
encoded_input,
generation_config=self.gen_config
)
# 解码并解析结果
response = self.tokenizer.decode(
outputs[0][len(encoded_input[0]):],
skip_special_tokens=True,
clean_up_tokenization_spaces=True
)
# 提取标签(容错处理)
if "标签:" in response:
label = response.split("标签:")[-1].strip()
return label if label else "拒识"
return "拒识"
4.2.4 分类主逻辑:整合三大模块
将 “嵌入模型、检索器、大模型” 串联,实现端到端分类流程,同时增加日志与异常处理:
import json
import logging
from core.models.embedding.bge_model import BGEEmbeddingModel
from core.retriever.milvus_retriever import MilvusRetriever
from core.models.llm.qwen2_model import QWen2TextClassifier
from core.tools.data_handler import load_jsonl, load_json # 工具函数:加载数据
# 配置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)
class HybridTextClassifier:
"""混合式文本分类器(BGE嵌入+Milvus检索+QWen2分类)"""
def __init__(self, config: Dict):
# 1. 初始化嵌入模型
self.embedding_model = BGEEmbeddingModel(
model_path=config["embedding_model_path"],
device=config.get("device", "auto")
)
logger.info("BGE嵌入模型加载完成")
# 2. 初始化检索器
self.retriever = MilvusRetriever(self.embedding_model)
self.retriever.connect_milvus(config["milvus_host"], config["milvus_port"])
self.retriever.load_collection(config["milvus_collection_name"])
logger.info("Milvus检索器加载完成")
# 3. 初始化大模型分类器
self.llm_classifier = QWen3TextClassifier(
model_path=config["llm_model_path"],
device=config.get("device", "auto"),
gen_params=config.get("llm_gen_params", {})
)
logger.info("QWen3大模型加载完成")
# 4. 加载标签定义
self.label_defs = load_json(config["label_def_path"])
logger.info(f"加载标签定义 {len(self.label_defs)} 个")
def classify(self, query_text: str, top_k: int = 5) -> Dict[str, str]:
"""执行分类,返回结果与中间信息"""
try:
logger.info(f"待分类文本:{query_text}")
# 步骤1:检索相似样本
similar_samples = self.retriever.retrieve_similar(query_text, top_k=top_k)
logger.debug(f"召回相似样本:{similar_samples}")
# 步骤2:构建Prompt
prompt = self.llm_classifier.build_classification_prompt(
query_text=query_text,
similar_samples=similar_samples,
label_defs=self.label_defs
)
# 步骤3:大模型预测
label = self.llm_classifier.predict_label(prompt)
logger.info(f"分类结果:{label}")
return {
"query_text": query_text,
"predicted_label": label,
"similar_samples": similar_samples,
"status": "success"
}
except Exception as e:
logger.error(f"分类失败:{str(e)}", exc_info=True)
return {
"query_text": query_text,
"predicted_label": "拒识",
"status": "failed",
"error_msg": str(e)
}
# 配置示例(实际使用时从configs文件加载)
if __name__ == "__main__":
CONFIG = {
"embedding_model_path": "BAAI/bge-base-zh-v1.5",
"llm_model_path": "qwen/Qwen3-0.6B",
"milvus_host": "localhost",
"milvus_port": "19530",
"milvus_collection_name": "text_cls_samples",
"label_def_path": "./dataset/label_data/label_def.json",
"llm_gen_params": {"temperature": 0.5, "top_p": 0.8},
"device": "auto"
}
# 初始化分类器并测试
classifier = HybridTextClassifier(CONFIG)
result = classifier.classify("茅台股价创年内新高,白酒板块走强")
print(json.dumps(result, ensure_ascii=False, indent=2))
- 工程优化
=======
根据技术演进趋势,可从以下方向进一步提升系统性能:
- 向量模型升级:将 BGE 替换为最新的 BGE-large-zh,语义匹配精度会提升 5%~8%;
- 大模型微调:若有少量标注数据(数百条),用 LoRA 对 QWen2 进行指令微调;
- 多标签支持:结合 ReAct 工具链,通过 “检索 - 决策 - 调整” 的多轮交互,实现多标签分类;
- 成本控制:使用 QWen2-1.5B-Int4 量化版,显存占用从 10GB 降至 4GB,推理速度提升 2 倍。
- 总结与技术趋势
==========
这套 “向量检索 + 大模型” 的文本分类方案,本质是 “检索式学习” 与 “大模型推理” 的融合,其核心价值在于 “低成本、高灵活、易落地”。从技术演进角度看,未来文本分类将向三个方向发展:
- 多模态融合:不仅处理文本,还能结合图像、音频信息分类(如 “图文商品分类”);
- 自主进化能力:模型可自主学习新类目,无需人工更新标签定义;
- 边缘部署:通过模型压缩、量化技术,将方案部署到边缘设备(如手机、IoT 设备),实现低延迟推理。
最后
我在一线科技企业深耕十二载,见证过太多因技术更迭而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。
我整理出这套 AI 大模型突围资料包:
- ✅AI大模型学习路线图
- ✅Agent行业报告
- ✅100集大模型视频教程
- ✅大模型书籍PDF
- ✅DeepSeek教程
- ✅AI产品经理入门资料
完整的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇

为什么说现在普通人就业/升职加薪的首选是AI大模型?
人工智能技术的爆发式增长,正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议,到全国两会关于AI产业发展的政策聚焦,再到招聘会上排起的长队,AI的热度已从技术领域渗透到就业市场的每一个角落。

智联招聘的最新数据给出了最直观的印证:2025年2月,AI领域求职人数同比增幅突破200% ,远超其他行业平均水平;整个人工智能行业的求职增速达到33.4%,位居各行业榜首,其中人工智能工程师岗位的求职热度更是飙升69.6%。
AI产业的快速扩张,也让人才供需矛盾愈发突出。麦肯锡报告明确预测,到2030年中国AI专业人才需求将达600万人,人才缺口可能高达400万人,这一缺口不仅存在于核心技术领域,更蔓延至产业应用的各个环节。


资料包有什么?
①从入门到精通的全套视频教程⑤⑥
包含提示词工程、RAG、Agent等技术点
② AI大模型学习路线图(还有视频解说)
全过程AI大模型学习路线

③学习电子书籍和技术文档
市面上的大模型书籍确实太多了,这些是我精选出来的

④各大厂大模型面试题目详解

⑤ 这些资料真的有用吗?
这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。
所有的视频教程由智泊AI老师录制,且资料与智泊AI共享,相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念,通过动态追踪大模型开发、数据标注伦理等前沿技术趋势,构建起"前沿课程+智能实训+精准就业"的高效培养体系。
课堂上不光教理论,还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事!


如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!
应届毕业生:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。
零基础转型:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界。
业务赋能 突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型。
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓**

更多推荐



所有评论(0)