大模型微调:用 QLoRA 训练一个淘宝客服机器人

6GB 显存玩转大模型微调:用 QLoRA 训练一个淘宝客服机器人

前言

大语言模型(LLM)微调听起来总是和「昂贵」挂钩------动辄 8 卡 A100、几十万的训练成本。但如果你只有一张 6GB 显存的普通消费级显卡(比如 RTX 3060 / 2060),也能做微调吗?

答案是可以

这篇文章记录了我在 Windows 环境下,用 QLoRA 4-bit 量化微调 Qwen2.5-3B-Instruct 模型的全过程。最终只用了 57MB 的额外存储,就让模型学会了淘宝客服的语气。


方案选型

要在 6GB 显存上微调 3B 参数的模型,关键是解决显存瓶颈:

技术 作用 显存节省
4-bit NF4 量化 模型权重从 16bit 压缩到 4bit ~4x
LoRA 只训练小部分参数,冻结其余 ~100x 可训练参数量减少
Gradient Checkpointing 不存中间激活值,反向传播时重新计算 ~3x
Gradient Accumulation 小批次模拟大批次 允许 batch_size=1

三者叠加后,3B 模型的显存占用从约 16GB 降到了 4.5GB 左右,6GB 显卡完全够用。

硬件与软件环境

复制代码
GPU: NVIDIA 6GB VRAM (CUDA 12.4)
模型: Qwen2.5-3B-Instruct (Qwen 系列, 中文友好)
Python: 3.10.11
PyTorch: 2.5.1+cu124
Transformers: 5.11.0
PEFT: 0.19.1

Python 依赖说明

版本 用途 是否必须
torch 2.5.1+cu124 PyTorch 深度学习框架,所有模型训练和推理的基础。cu124 表示 CUDA 12.4 版本 必须
transformers 5.11.0 HuggingFace 的模型加载、训练、推理统一框架。提供 AutoModel、Trainer、Tokenizer 等核心 API 必须
peft 0.19.0 参数高效微调库。提供 LoRA、QLoRA 等微调方法,只需几行代码就能给模型注入 LoRA 适配器 必须
bitsandbytes 0.45.0 4bit/8bit 量化库。负责将模型权重压缩到 4bit 精度,大幅降低显存占用 必须
datasets 3.0.0 HuggingFace 数据集库。提供 Dataset 类,方便加载、切分、预处理训练数据 必须
accelerate 1.0.0 PyTorch 分布式训练工具。Transformer 的 Trainer 内部依赖它管理设备、混合精度等 必须
modelscope 1.0.0 阿里达摩院的模型库(国内替代 HuggingFace Hub)。在国内可以从 ModelScope 高速下载模型 国内必需
scipy 间接依赖 bitsandbytes 的优化器依赖 scipy 中的一些数值计算函数 间接依赖

数据集准备

微调需要高质量的对话数据。我生成了 117 条淘宝客服对话,覆盖 15 个常见场景:

  • 商品咨询(材质、颜色、尺码)
  • 议价还价
  • 物流查询
  • 售后处理
  • 催单发货
  • 退换货
  • 优惠活动

每条数据格式为 instruction(顾客问题)+ output(客服回答)。

数据质量重于数量。 117 条足够让模型学会特定的说话风格,因为 LoRA 微调的本质是「调整语气」而非「学习新知识」,基座模型 Qwen2.5-3B 本身已经具备了强大的语言理解能力。

训练集示例:

json 复制代码
{
  "instruction": "这款衣服会缩水吗?",
  "output": "亲,这款是预缩水处理过的面料呢,正常洗涤不会缩水的哦~放心穿好啦!"
}

训练参数详解

下面逐一说明训练脚本中的每个参数------它的作用、是否必须设置、合理取值范围,以及不同的值对训练结果的影响。

数据加载与预处理

MAX_LENGTH = 512
项目 说明
作用 每条数据截断/填充到的最大 token 数
必要性 必须设置。批次中的样本需要统一长度才能组成矩阵计算
合理范围 128 ~ 2048,取决于任务
值设太小 长文本被截断,丢失信息
值设太大 浪费显存。最大长度直接影响显存占用,512 -> 1024 显存需求翻倍
如何判断 统计数据集中最长样本的 token 数,设为略高于该值

对于淘宝客服对话这种短文本场景,512 tokens 绰绰有余。

BitsAndBytes 4bit 量化

python 复制代码
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
)
load_in_4bit
项目 说明
作用 将模型权重加载为 4bit 精度
必要性 核心参数。6GB 显存必须开启
可选值 True / False(False 时为 16bit)
影响 开启后显存降为 1/4,但推理速度稍慢。不开的话 3B 模型约需 12-16GB
bnb_4bit_compute_dtype
项目 说明
作用 实际计算时使用的精度
必要性 建议设置
可选值 torch.float16 / torch.bfloat16 / torch.float32
影响 float16 是效率和精度的平衡点。bfloat16 更稳定但部分显卡不支持。float32 数值更稳但显存翻倍、速度慢
bnb_4bit_use_double_quant
项目 说明
作用 对量化常数再做一次量化
必要性 可选。6GB 显存建议开启
可选值 True / False
影响 开启后额外省约 0.5-1GB 显存,精度几乎无损
bnb_4bit_quant_type
项目 说明
作用 4bit 量化的具体格式
必要性 建议设置
可选值 "nf4"(NormalFloat4)/ "fp4"
影响 NF4 是 bitsandbytes 针对正态分布权重优化的格式,比普通 fp4 精度更高,通吃所有场景。这是默认推荐,不需要特殊原因改用 fp4

LoRA 配置

python 复制代码
lora_config = LoraConfig(
    r=8,
    lora_alpha=16,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)

LoRA 的核心思想是:在原始权重矩阵旁边插入一个低秩矩阵,只训练这个小矩阵。原始权重保持不变。

r(LoRA Rank)
项目 说明
作用 低秩矩阵的秩,控制可训练参数量
必要性 必须设置
合理范围 4 ~ 64
值设太小(r=1~2) 表达能力不足,模型学不到风格变化
值设太大(r=64~256) 可训练参数量暴增,容易过拟合且显存占用大
如何选择 风格微调 r=8 足够。复杂任务(如代码能力、知识注入)可能需要 r=16~32

本项目 r=8,可训练参数约 1500 万,不到模型总量的 0.5%。

r=8 vs r=64 对比:

  • 可训练参数:1500 万 vs 1.2 亿(8 倍)
  • 显存占用:+100MB vs +800MB
  • 风险:r=8 几乎不会过拟合严重,r=64 在小数据上很容易记住训练集
lora_alpha
项目 说明
作用 LoRA 权重的缩放系数,控制微调对原始权重的影响强度
必要性 必须设置
合理范围 通常是 r 的 1~4 倍
公式 output = original + (alpha / r) * lora_weight
值太小 微调效果不明显,模型几乎没有改变
值太大 微调影响过强,可能破坏基座模型的原始能力
经验法则 alpha = 2 * r 是安全起点。本项目 r=8, alpha=16
target_modules
项目 说明
作用 指定对模型中的哪些线性层应用 LoRA
必要性 必须指定。不同模型结构不同,需要查对应文档
可选值 取决于模型架构。Qwen2.5 的标准注意力层(q/k/v/o)和 FFN 层(gate/up/down)
影响 只训练 attention 层(q/k/v/o)可减少参数量,但对能力的改变有限。加上 FFN 层(gate/up/down)效果更好。全部 7 个模块是 Qwen 系列的最佳实践
lora_dropout
项目 说明
作用 训练时随机丢弃 LoRA 层的一部分输出,防止过拟合
必要性 建议设置(除非数据量极大)
合理范围 0 ~ 0.2
值设 0 不丢弃,训练更快但容易过拟合
值设太大(>0.2) 模型训练不稳定,难以收敛
如何选择 数据少(<500 条)用 0.05~0.1。数据多(>5000 条)用 0 或 0.01
bias
项目 说明
作用 是否训练偏置项(bias)
必要性 保持默认即可
可选值 "none" / "all" / "lora_only"
影响 一般设为 "none"。训练 bias 几乎没有收益,反而增加过拟合风险
task_type
项目 说明
作用 告诉 PEFT 库模型的任务类型
必要性 必须设置
可选值 "CAUSAL_LM"(生成模型) / "SEQ_CLS"(分类)等
影响 设置错误会导致模型结构不匹配,加载或训练报错

TrainingArguments

python 复制代码
training_args = TrainingArguments(
    output_dir=OUTPUT_DIR,
    num_train_epochs=EPOCHS,
    per_device_train_batch_size=BATCH_SIZE,
    per_device_eval_batch_size=1,
    gradient_accumulation_steps=4,
    learning_rate=LR,
    warmup_steps=10,
    logging_steps=5,
    eval_steps=20,
    save_steps=40,
    eval_strategy="steps",
    save_strategy="steps",
    load_best_model_at_end=True,
    report_to="none",
    fp16=True,
    gradient_checkpointing=True,
    optim="adamw_8bit",
    remove_unused_columns=False,
    dataloader_num_workers=0,
)
num_train_epochs
项目 说明
作用 完整遍历训练集的次数
必要性 必须设置
合理范围 1 ~ 50
值设太少(1~2) 模型没充分学习,风格变化不明显
值设太多(>30) 过拟合,模型开始死记硬背训练集
如何选择 风格微调 5~10 轮通常足够。如果 eval_loss 连续 5 次不降就应停止

本项目用了 20 轮,偏多。5~10 轮可能就够。

per_device_train_batch_size
项目 说明
作用 每张显卡每次前向传播的样本数
必要性 必须设置
合理范围 1 ~ 32(取决于显存)
值设太大 OOM(显存溢出),训练直接崩溃
值设太小 梯度噪声大,训练不稳定
6GB 显存能设多大 3B 模型 4bit 量化 + gradient checkpointing,batch_size=1 是极限

没关系,batch_size 小可以通过 gradient accumulation 弥补。

per_device_eval_batch_size
项目 说明
作用 验证时的批次大小
必要性 建议设置
影响 不影响训练质量,也不影响梯度。只要不 OOM,设多少都行。设小一点更保险
gradient_accumulation_steps
项目 说明
作用 累积多少步的梯度后更新一次参数
必要性 小显存必备
合理范围 1 ~ 16
公式 等效 batch_size = per_device_batch_size × gradient_accumulation_steps
值设 1 即不累积。等效 batch_size = 1,梯度噪声大
值设太大(>16) 训练速度变慢,且等效 batch_size 过大可能降低模型泛化能力
本项目 batch_size=1, accum=4,等效 batch_size=4,是合理值

需要注意:梯度累积只影响参数更新的频率,不额外占用显存。这是低显存场景下最重要的技巧之一。

learning_rate
项目 说明
作用 每次参数更新的步长
必要性 必须设置。几乎所有训练中最重要的超参数
合理范围 1e-5 ~ 1e-3
值设太大(>5e-4) loss 震荡不收敛,甚至发散
值设太小(<1e-5) 训练极其缓慢,甚至陷入局部最优
LoRA 微调的典型值 1e-4 ~ 3e-4(比全量微调高,因为只训练少量参数)

本项目 lr=2e-4,是 LoRA 微调的标准值。

不同学习率的效果对比(粗略):

学习率 效果
5e-5 训练慢但稳定,适合对质量要求极高的任务
2e-4 微调的最佳平衡点
5e-4 训练快但可能不稳定。需要配合 warmup
1e-3 很可能发散,loss 变成 NaN
warmup_steps
项目 说明
作用 训练开始时,学习率从 0 线性增加到目标值的步数
必要性 建议设置
合理范围 训练总步数的 5~10%
影响 防止刚开始训练时大学习率导致 loss 爆炸。特别在使用 8bit AdamW 时尤为重要

本项目 warmup_steps=10,总步数 540 步,约占比 1.8%,略偏低但够用。

logging_steps / eval_steps / save_steps
参数 作用 合理范围 关联关系
logging_steps 每多少步打印一次 loss 1~20
eval_steps 每多少步做一次验证 10~100 值越小,训练越慢(验证也要前向传播)
save_steps 每多少步保存一次 checkpoint 必须为 eval_steps 的整数倍 建议 save=2×eval

重要:save_steps 必须是 eval_steps 的倍数,否则会报错。因为 Transformers 需要在验证的同时决定是否保存。

本项目 eval_steps=20, save_steps=40,符合要求。

eval_strategy / save_strategy
项目 说明
作用 控制验证/保存的时机策略
必要性 必须设置
可选值 "steps"(按步数)/ "epoch"(按轮数)/ "no"(不做)
影响 小数据集推荐 "steps",可以更精细地监控 loss 变化

注意:Transformers 5.x 后 evaluation_strategy 已重命名为 eval_strategy

load_best_model_at_end
项目 说明
作用 训练结束后自动加载验证集 loss 最低的 checkpoint
必要性 强烈建议开启
影响 防止保存的最终模型恰好是过拟合的状态。配合 save_strategy="steps" 使用
fp16
项目 说明
作用 使用 16bit 浮点数训练(半精度训练)
必要性 6GB 显存必须开启
可选值 True / False
影响 开启后显存减半、速度翻倍。代价是数值精度略降,但对 LoRA 微调几乎无影响
gradient_checkpointing
项目 说明
作用 不缓存前向传播的中间激活值,反向传播时重新计算
必要性 6GB 显存必须开启
影响 省显存(约省 30-50%),但训练速度慢约 20%

这是典型的用时间换空间。对于显存瓶颈的场景,这是最值得开启的选项。

optim
项目 说明
作用 选择优化器类型
必要性 建议显式设置
可选值 "adamw_torch" / "adamw_8bit" / "adamw_bnb_8bit"
影响 "adamw_8bit" 使用 bitsandbytes 的 8bit 优化器,优化器状态从 32bit 降为 8bit,省显存 2-3GB。这是低显存场景的最佳选择
remove_unused_columns
项目 说明
作用 是否自动移除数据集中模型不需要的列
必要性 看具体代码
影响 如果你的数据集包含多余的列(比如原始 JSON 的 instruction、output 字段),设置为 True 会自动移除。但在某些情况下(比如自定义 DataCollator)设为 True 会报错,设为 False 更保险
dataloader_num_workers
项目 说明
作用 数据加载的子进程数
必要性 Windows 下必须设为 0
影响 Windows 的 multiprocessing 和 PyTorch 兼容性不好,设 >0 可能死锁。Linux 下可以设为 4~8 来加快数据加载

训练结果

复制代码
Training completed. Final loss:
  train_loss: 0.0099
  eval_loss:  0.3179

loss 解读

loss 是模型对下一个 token 预测的困惑度。数值越低,说明模型的预测越准确。

  • train_loss: 0.0099 --- 模型在训练集上几乎完美预测下一个 token。exp(-0.0099) ≈ 0.99,即预测正确概率约 99%
  • eval_loss: 0.3179 --- 在未见过的验证集上,预测正确概率约 exp(-0.3179) ≈ 73%

两个 loss 的差距(0.0099 vs 0.3179) 看起来很大,但因为 117 条数据量小,模型很容易在训练集上趋近于 0。关键看 eval_loss,0.3179 对于对话生成任务来说是个不错的值。

loss 数值的一般参考

数值 含义
< 0.1 训练集上几乎完美拟合
0.3 ~ 0.5 对 3B 模型来说效果良好
0.5 ~ 1.0 正常水平,有提升空间
1.0 ~ 2.0 模型还在学习中
> 2.0 基本没学到或者任务本身很难

注意:不同任务、不同模型的 loss 值不能直接对比。一个 7B 模型在技术文档问答上的 eval_loss=0.5 可能比 3B 模型的 0.3 更难。

关于过拟合的讨论

train_loss 0.0099 接近 0,看起来像是过拟合,但实际回答并没有复读训练集。

原因在于:

  1. LoRA 只动了 0.48% 的参数,大量原始参数被冻结,泛化能力损失小
  2. 任务简单------只改语气不改知识,模型不需要记忆训练集内容
  3. 基座模型强------Qwen2.5-3B 本身能力足够,微调只是在输出层调整表达风格

如果数据量更大(500+),即使减少到 5-10 轮也能达到类似效果,泛化会更好。


训练成本汇总

项目 数值
总训练时间 ~67 分钟
总步数 540 步
峰值显存占用 ~4.5GB / 6GB
LoRA 权重大小 57MB
训练集大小 117 条
可训练参数 1500 万 (0.48%)

效果测试

用 7 个新问题测试微调效果:

复制代码
顾客: 你好,这款卫衣有加绒的吗?
客服: 亲,有的呢!加绒版卫衣特别暖和,舒适感杠杠滴,买它准没错啦~

顾客: 能便宜点吗?
客服: 亲,现在已经是活动期间了呢!再便宜也没法更便宜啦~
      不过如果一次性购买多件的话也是可以的哦,价格也会优惠很多呢~

顾客: 质量有问题怎么办?
客服: 亲,质量问题可以随时联系我们售后的,我们会给您安排退换货
      或者补发新件的哦~有任何问题都可以直接告诉我呀!~

顾客: 我再考虑考虑
客服: 亲,不着急,您慢慢选,有啥问题随时联系我哦~!

风格特征非常明显:

  • 称呼用「亲」
  • 语气词「哦、呢、啦、哟」
  • 波浪线「~」
  • 感叹号「!」
  • 热情耐心的解决问题态度

总结

6GB 显存微调 3B 模型是完全可行的。 这套技术栈(QLoRA + 4bit + Gradient Checkpointing + Gradient Accumulation)已经成为低资源微调的事实标准。几条经验:

  1. 数据量不是越大越好------对风格微调,100-200 条高质量数据即可
  2. LoRA rank 不是越大越好------rank=8 对风格调整已经足够
  3. 监控 eval_loss------训练集 loss 低不代表泛化好,两个 loss 一起看
  4. 学习率是影响最大的超参数------LoRA 微调从 2e-4 开始调
  5. gradient_accumulation 是小显存的救星------batch_size=1 也能等效大 batch
  6. 国内用户用 ModelScope------比 HuggingFace 镜像稳定得多,速度 10-15MB/s

如果你想尝试自己的微调项目,这个流程几乎可以复用到任何风格或场景的微调上------换个数据集就行。


完整代码

train.py(QLoRA 微调脚本)

python 复制代码
"""
QLoRA 微调脚本 - 淘宝客服风格
模型: Qwen2.5-3B-Instruct (4bit 量化)
"""

import json
import os

# 使用 ModelScope 国内镜像下载模型
from modelscope import snapshot_download
from datasets import Dataset
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
    TrainingArguments,
    Trainer,
    DataCollatorForSeq2Seq,
)
import torch
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training

# ===== 配置 =====
MODEL_NAME = "Qwen/Qwen2.5-3B-Instruct"
MODEL_DIR = os.path.join(os.path.dirname(__file__), "models", "Qwen2.5-3B-Instruct")
DATA_PATH = "data/taobao_cs_train.json"
OUTPUT_DIR = "outputs/taobao_cs_lora"
MAX_LENGTH = 512
BATCH_SIZE = 1
EPOCHS = 20
LR = 2e-4

# ===== 加载数据集 =====
def load_data(path):
    with open(path, "r", encoding="utf-8") as f:
        data = json.load(f)
    texts = []
    for item in data:
        prompt = f"顾客:{item['instruction']}\n客服:"
        response = item["output"]
        texts.append({"text": prompt + response + "<|im_end|>"})
    return Dataset.from_list(texts)

dataset = load_data(DATA_PATH)
print(f"数据集大小: {len(dataset)} 条")

# ===== 4bit 量化配置 (省显存) =====
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
)

# ===== 加载模型和分词器 =====
print(f"正在下载/加载模型: {MODEL_NAME}")
if not os.path.exists(MODEL_DIR):
    print("从 ModelScope 下载模型...")
    model_path = snapshot_download(MODEL_NAME, cache_dir=os.path.dirname(MODEL_DIR))
else:
    model_path = MODEL_DIR
print(f"模型路径: {model_path}")

model = AutoModelForCausalLM.from_pretrained(
    model_path,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True,
    dtype=torch.float16,
)

tokenizer = AutoTokenizer.from_pretrained(
    model_path,
    trust_remote_code=True,
    padding_side="right",
)
tokenizer.pad_token = tokenizer.eos_token

# ===== 处理数据 =====
def tokenize_fn(examples):
    tokenized = tokenizer(
        examples["text"],
        truncation=True,
        max_length=MAX_LENGTH,
        padding="max_length",
    )
    tokenized["labels"] = tokenized["input_ids"].copy()
    return tokenized

dataset = dataset.map(tokenize_fn, remove_columns=["text"], batched=False)
dataset = dataset.train_test_split(test_size=0.1, seed=42)
train_dataset = dataset["train"]
eval_dataset = dataset["test"]
print(f"训练集: {len(train_dataset)} 条, 验证集: {len(eval_dataset)} 条")

# ===== QLoRA 配置 =====
model = prepare_model_for_kbit_training(model)

lora_config = LoraConfig(
    r=8,
    lora_alpha=16,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()

# ===== 训练参数 =====
training_args = TrainingArguments(
    output_dir=OUTPUT_DIR,
    num_train_epochs=EPOCHS,
    per_device_train_batch_size=BATCH_SIZE,
    per_device_eval_batch_size=1,
    gradient_accumulation_steps=4,
    learning_rate=LR,
    warmup_steps=10,
    logging_steps=5,
    eval_steps=20,
    save_steps=40,
    eval_strategy="steps",
    save_strategy="steps",
    load_best_model_at_end=True,
    report_to="none",
    fp16=True,
    gradient_checkpointing=True,
    optim="adamw_8bit",
    remove_unused_columns=False,
    dataloader_num_workers=0,
)

# Data collator - 不对 labels 做额外 padding
data_collator = DataCollatorForSeq2Seq(
    tokenizer=tokenizer,
    model=model,
    padding=True,
    label_pad_token_id=-100,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    processing_class=tokenizer,
    data_collator=data_collator,
)

# ===== 开始训练 =====
print("\n开始训练...")
trainer.train()

# ===== 保存模型 =====
model.save_pretrained(OUTPUT_DIR)
tokenizer.save_pretrained(OUTPUT_DIR)
print(f"\n模型已保存到: {OUTPUT_DIR}")

infer.py(推理测试脚本)

python 复制代码
"""
推理脚本 - 测试微调后的淘宝客服模型
"""

import json
import os

# 使用 ModelScope 国内镜像
from modelscope import snapshot_download
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel

# ===== 配置 =====
BASE_MODEL = "Qwen/Qwen2.5-3B-Instruct"
LOCAL_MODEL_DIR = os.path.join(os.path.dirname(__file__), "models", "Qwen2.5-3B-Instruct")
LORA_PATH = "outputs/taobao_cs_lora"

# ===== 加载模型 =====
print("正在加载模型...")

# 检查本地是否有缓存,没有则从 ModelScope 下载
if os.path.exists(os.path.join(os.path.dirname(__file__), "models", "Qwen", "Qwen2___5-3B-Instruct")):
    model_path = os.path.join(os.path.dirname(__file__), "models", "Qwen", "Qwen2___5-3B-Instruct")
else:
    model_path = snapshot_download(BASE_MODEL, cache_dir=os.path.join(os.path.dirname(__file__), "models"))

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
)

model = AutoModelForCausalLM.from_pretrained(
    model_path,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True,
    torch_dtype=torch.float16,
)

tokenizer = AutoTokenizer.from_pretrained(
    model_path,
    trust_remote_code=True,
)
tokenizer.pad_token = tokenizer.eos_token

# 加载 LoRA 权重
model = PeftModel.from_pretrained(model, LORA_PATH)
print("加载完成!\n")

# ===== 对话 =====
def chat(prompt, max_new_tokens=128, temperature=0.7):
    text = f"顾客:{prompt}\n客服:"
    inputs = tokenizer(text, return_tensors="pt").to(model.device)
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=max_new_tokens,
            temperature=temperature,
            top_p=0.9,
            do_sample=True,
            repetition_penalty=1.1,
            pad_token_id=tokenizer.eos_token_id,
        )
    response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
    if "\n" in response:
        response = response[:response.index("\n")]
    return response.strip()

# ===== 测试 =====
import sys

mode = input("选择模式: 1=自动测试  2=手动对话  (1/2): ").strip()

if mode == "2":
    print("\n===== 手动对话模式 (输入 exit 退出) =====\n")
    while True:
        prompt = input("顾客: ")
        if prompt.lower() in ("exit", "quit", "退出"):
            break
        reply = chat(prompt)
        print(f"客服: {reply}\n")
else:
    test_cases = [
        "你好,这款卫衣有加绒的吗?",
        "能便宜点吗?",
        "什么时候能发货?",
        "质量有问题怎么办?",
        "这个颜色会掉色吗?",
        "有优惠券吗?",
        "我再考虑考虑",
    ]

    print("\n===== 淘宝客服风格测试 =====\n")
    for question in test_cases:
        reply = chat(question)
        print(f"顾客: {question}")
        print(f"客服: {reply}")
        print()

data/taobao_cs_train.json(训练数据集,共 117 条)

json 复制代码
[
  {
    "instruction": "你好,这款连衣裙有白色的吗?",
    "output": "亲,有的呢!这款一共有3个颜色哦,白色、黑色和粉色都非常好看呢~现在下单明天就能发货哟!"
  },
  {
    "instruction": "这个手机壳适配iPhone 15 Pro吗?",
    "output": "亲亲,这款手机壳是专门为iPhone 15 Pro设计的哦,孔位精准,手感超棒!现在下单还送钢化膜呢~"
  },
  {
    "instruction": "这款鞋子码数标准吗?我平时穿38的",
    "output": "亲,这款鞋子码数偏标准呢,您平时穿38的话拍38码就可以啦~如果不合适咱家支持退换货哦,放心购买!"
  },
  {
    "instruction": "这个包是真皮的吗?",
    "output": "亲,这款是头层牛皮的哦,质感非常好,而且咱们有7天无理由退换,您可以收到货后看看品质,不满意随时退呢~"
  },
  {
    "instruction": "这件衣服会缩水吗?",
    "output": "亲亲,这款面料是经过预缩处理的,正常洗涤不会缩水呢!建议反面洗、反面晒,可以穿更久哦~"
  },
  {
    "instruction": "这件衣服面料舒服吗?",
    "output": "亲,面料是纯棉的哦,手感非常柔软,贴身穿也很舒服呢!很多买家都反馈说质量很好,放心入手吧~"
  },
  {
    "instruction": "这个杯子能不能装开水?",
    "output": "亲,这款杯子是耐高温高硼硅玻璃的,可以装100度开水呢!而且冷热交替也不容易炸裂,质量杠杠的~"
  },
  {
    "instruction": "这个充电宝能带上飞机吗?",
    "output": "亲,这款是20000毫安以内的,符合民航规定,可以带上飞机的哦!具体可以看看详情页的说明呢~"
  },
  {
    "instruction": "键盘是机械的吗?",
    "output": "亲,是的呢!这款是真正的机械键盘,青轴手感,打字声音清脆好听,办公游戏都适合哦~"
  },
  {
    "instruction": "这个项链会不会褪色?",
    "output": "亲,这款是钛钢材质,不褪色不过敏的呢!正常佩戴可以保持很久哦,洗澡睡觉都不用摘呢~"
  },
  {
    "instruction": "有适合敏感肌用的吗?",
    "output": "亲,有的呢!这款就是专为敏感肌设计的,不含酒精香精,温和不刺激,很多敏感肌的买家用了都说好哦~"
  },
  {
    "instruction": "这个冰箱多大容量?",
    "output": "亲,这款是180升的,两个人的家庭用刚刚好呢!尺寸详情页有写,建议先量一下家里的位置再下单哦~"
  },
  {
    "instruction": "这个沙发可以定制颜色吗?",
    "output": "亲,目前有灰色、米色、蓝色3个颜色可选哦,都是百搭色系呢!定制的话暂时不支持呢~"
  },
  {
    "instruction": "这款手表的表盘多大?",
    "output": "亲,表盘直径是42mm的,男士戴刚刚好呢!而且是一款很百搭的款式,上班休闲都能戴哦~"
  },
  {
    "instruction": "这个眼影盘飞粉吗?",
    "output": "亲,这款压粉很实的,不怎么飞粉呢!而且显色度很好,新手也很好驾驭哦,颜色搭配也很日常~"
  },
  {
    "instruction": "被子是几斤重的?",
    "output": "亲,这款有4斤、6斤、8斤三个规格呢!南方冬天6斤就够啦,北方建议选8斤的哦~"
  },
  {
    "instruction": "这个锅会粘锅吗?",
    "output": "亲,这款是麦饭石涂层的不粘锅,正常使用不会粘的呢!建议用硅胶铲,可以延长使用寿命哦~"
  },
  {
    "instruction": "这个精华液效果怎么样?",
    "output": "亲,这款主打补水保湿,很多买家反馈用了一周皮肤明显水润了很多呢!坚持用效果更好哦~"
  },
  {
    "instruction": "这个积木适合几岁小孩玩?",
    "output": "亲,这款适合3岁以上的宝宝玩哦,颗粒大小适中,不会误吞,而且颜色鲜艳很吸引小朋友呢~"
  },
  {
    "instruction": "这款茶什么味道?",
    "output": "亲,这款是茉莉花茶,香气清新,入口回甘呢!喜欢花茶的亲一定不要错过哦~"
  },
  {
    "instruction": "这个体重秤准不准?",
    "output": "亲,这款是高精度传感器的,误差在0.1斤以内呢!而且可以连接手机APP,记录你的体重变化哦~"
  },
  {
    "instruction": "这个台灯伤眼睛吗?",
    "output": "亲,这款是护眼LED灯,无频闪无蓝光危害的哦!看书办公都很合适,光线柔和均匀呢~"
  },
  {
    "instruction": "能便宜点吗?",
    "output": "亲亲,这款已经是活动最低价了哦,性价比超高呢!而且现在下单还送赠品,算下来非常划算啦~"
  },
  {
    "instruction": "再便宜20块我就买了",
    "output": "亲,真的非常抱歉呢,这个价格已经到底了哦T_T 不过现在有满减活动,满199减20,您可以凑单更划算呢~"
  },
  {
    "instruction": "有优惠券吗?",
    "output": "亲,有的哦!您点进店铺首页就可以领优惠券啦,新人还有专属红包呢~关注店铺还能再减5元哟!"
  },
  {
    "instruction": "能不能包邮啊?",
    "output": "亲,这款本身就是包邮的呢!偏远地区除外哈,您可以直接下单看看,系统会自动计算邮费的哦~"
  },
  {
    "instruction": "我是老顾客了,给个折扣呗",
    "output": "亲,感谢您一直以来的支持呢!我这边实在没有改价权限呢T_T 不过我可以帮您争取一份小礼品作为感谢哦~"
  },
  {
    "instruction": "别家都卖99,你怎么卖129",
    "output": "亲,咱们家品质有保障的呢!用的都是好材料,支持质检,一分钱一分货哦~您可以看看买家秀,品质绝对对得起价格!"
  },
  {
    "instruction": "两件一起买能优惠吗?",
    "output": "亲,两件一起拍下系统会自动满减的呢!您先加购物车看看有没有优惠,如果没有的话我帮您问问能不能申请个优惠~"
  },
  {
    "instruction": "双十一会比现在便宜吗?",
    "output": "亲,现在就是双十一同价了呢!而且现在买不用等物流高峰,早买早享受哦~后续保价,降价退差价呢!"
  },
  {
    "instruction": "我是学生党,能优惠点吗",
    "output": "亲亲,理解呢!学生党也不容易T_T 这款本身利润很低的呢,不过您可以关注店铺领个新人券,能省一点是一点哦~"
  },
  {
    "instruction": "什么时候发货?",
    "output": "亲,咱们是48小时内发货的呢,一般当天下午3点前的订单都能当天发出哦!发出后我会第一时间告诉您物流单号哒~"
  },
  {
    "instruction": "发什么快递?",
    "output": "亲,默认发中通快递哦,如果您想要顺丰的话可以补差价呢,顺丰一般次日就到啦~"
  },
  {
    "instruction": "能修改地址吗?",
    "output": "亲,订单还没发出的话是可以修改地址的呢!您把新地址发我,我马上帮您安排修改哦~"
  },
  {
    "instruction": "可以发顺丰吗?",
    "output": "亲,可以的呢!您拍下顺丰加价链接就可以啦,一般次日达哦,着急的话强烈推荐顺丰呢~"
  },
  {
    "instruction": "到北京要几天?",
    "output": "亲,发中通的话一般2-3天到呢,顺丰的话次日就到了哦!您着急用的话建议选顺丰哈~"
  },
  {
    "instruction": "能发国外吗?",
    "output": "亲,目前咱们只支持国内配送呢,暂时不支持海外哦,非常抱歉呢T_T"
  },
  {
    "instruction": "有货吗?会不会拍下没货?",
    "output": "亲,页面能拍就是有货的哦!库存是实时更新的,您放心拍下就好啦~"
  },
  {
    "instruction": "可以指定快递公司吗?",
    "output": "亲,系统默认发中通呢,暂时不支持指定其他快递哦。不过如果您那边中通不到的,可以备注一下,我们帮您换其他快递呢~"
  },
  {
    "instruction": "怎么退货?",
    "output": "亲,您别着急哦~在订单页面点击申请退货,选择原因提交就可以啦。审核通过后您把商品寄回,我们收到就会尽快处理退款的哦!"
  },
  {
    "instruction": "衣服收到有质量问题",
    "output": "亲,实在不好意思呢!您拍个照片发我看看,确认后我马上给您安排补发或退款,您看怎么处理方便呢?"
  },
  {
    "instruction": "发错颜色了",
    "output": "亲亲,非常抱歉给您发错颜色了!您拍照发我一下,我马上安排重新发正确的颜色,发错的您也不用退回来啦,就当送您的~"
  },
  {
    "instruction": "尺码太大想换小一码",
    "output": "亲,可以换的呢!您直接在订单页面申请换货,选择小一码就可以啦。换货运费由我们承担哦,您放心~"
  },
  {
    "instruction": "可以退款吗?我不想要了",
    "output": "亲,没拆封不影响二次销售的话是可以退的呢!您直接申请退货退款就可以啦,我们会尽快处理的哦~"
  },
  {
    "instruction": "退款什么时候到账?",
    "output": "亲,我们收到退货后会尽快处理退款呢,一般1-3个工作日到账哦,请您耐心等待一下呢~"
  },
  {
    "instruction": "商品破损了怎么办",
    "output": "亲,非常抱歉给您带来不好的体验呢!您拍一下破损的照片发我,我马上安排补发或者退款,您看哪个方式方便呢?"
  },
  {
    "instruction": "少发了一个配件",
    "output": "亲亲,实在不好意思呢!我马上帮您安排补发缺少的配件,运费我们承担,您放心哦~"
  },
  {
    "instruction": "衣服洗了一次就掉色了",
    "output": "亲,非常抱歉呢!深色衣服第一次洗轻微掉色是正常的哦,建议反面洗、冷水洗呢。如果掉色严重的话,您拍个照片我看看,质量问题我们负责的哦~"
  },
  {
    "instruction": "怎么还没发货?都三天了",
    "output": "亲,非常抱歉让您久等了!我马上帮您催一下仓库,今天一定给您安排发出,发出后第一时间通知您哦~"
  },
  {
    "instruction": "物流怎么不动了",
    "output": "亲,我帮您查一下哦~可能是中转站扫描延迟,我联系快递公司核实一下,有消息立刻回复您呢!"
  },
  {
    "instruction": "今天能发吗?急用",
    "output": "亲,我帮您催一下仓库,尽量今天给您安排发出呢!急用的话下次建议选顺丰哦,到货更快呢~"
  },
  {
    "instruction": "显示签收了但我没收到",
    "output": "亲,您别急呢!可能是代收点代签了,先问问家人朋友有没有帮收。如果确实没收到,我马上联系快递公司核实哦~"
  },
  {
    "instruction": "能不能发快点",
    "output": "亲,我帮您备注加急哦!正常时效是2-3天呢,您耐心等待一下,到了我通知您~"
  },
  {
    "instruction": "收到了,质量不错",
    "output": "亲,感谢您的认可!如果满意的话麻烦给个五星好评哦,您的支持是我们最大的动力呢~欢迎下次再来!"
  },
  {
    "instruction": "东西一般般吧",
    "output": "亲,不好意思没能让您完全满意呢T_T 您有什么建议可以告诉我们,我们一定会改进的!如果商品有问题也可以随时联系我们售后哦~"
  },
  {
    "instruction": "收到了,挺好的",
    "output": "亲,太棒啦!感谢您的支持呢~如果满意的话记得给个五星好评哦,还会有惊喜红包呢!"
  },
  {
    "instruction": "质量和图片一样,好评",
    "output": "亲,感谢您的好评呢!我们一直坚持实物拍摄,保证所见即所得哦~下次再来还有优惠呢!"
  },
  {
    "instruction": "包装很用心,没有破损",
    "output": "亲,感谢您的认可呢!咱们包装都是层层加固的,就是怕运输途中损坏呢~您的满意是我们最大的动力哦!"
  },
  {
    "instruction": "这个耳机降噪效果怎么样?",
    "output": "亲,这款是主动降噪的哦,在地铁上也能听得很清楚呢!而且续航长达30小时,充一次电可以用一周啦~"
  },
  {
    "instruction": "有黑色的吗?",
    "output": "亲,有的呢!黑色、白色、蓝色三色可选,黑色最百搭也最耐脏,很多亲都选黑色哦~"
  },
  {
    "instruction": "有线的还是蓝牙的?",
    "output": "亲,这款是蓝牙5.3的哦,连接稳定不卡顿,10米以内都可以正常使用呢~"
  },
  {
    "instruction": "续航真有那么长吗?",
    "output": "亲,这个是实验室数据呢,日常使用大概25小时左右,也完全够用啦!很多买家反馈都说充一次能用好几天呢~"
  },
  {
    "instruction": "这个护肤品适合油皮吗?",
    "output": "亲,这款就是专门为油皮设计的哦,清爽不油腻,控油效果很好的呢!"
  },
  {
    "instruction": "会不会闷痘?",
    "output": "亲,不会的呢!这款是清爽配方,不含致痘成分,油皮用了都说好哦~"
  },
  {
    "instruction": "味道好闻吗?",
    "output": "亲,是淡淡的清香哦,很自然的味道,不会刺鼻呢!很多亲都反馈说味道很好闻呢~"
  },
  {
    "instruction": "我先看看",
    "output": "好的亲,您慢慢看呢!有什么问题随时找我哈~今天下单明天就能发货,早买早享受哦!"
  },
  {
    "instruction": "我再考虑考虑",
    "output": "亲,现在活动价真的很划算呢,随时可能恢复原价哦~而且库存也不多了,喜欢的话建议早点下手呢!"
  },
  {
    "instruction": "先加购吧",
    "output": "好的亲,加购不迷路哦!活动随时结束,看好了就下手哈~需要的时候直接找我呢!"
  },
  {
    "instruction": "已经下单了",
    "output": "亲,感谢您的下单呢!我们会尽快安排发货的哦,发出后第一时间通知您物流信息哒~"
  },
  {
    "instruction": "保修期多久?",
    "output": "亲,这款有一年质保呢!一年内出现质量问题都可以联系我们,免费维修或换新哦,放心购买~"
  },
  {
    "instruction": "配件丢了能补吗?",
    "output": "亲,可以补的呢!您告诉我是缺了哪个配件,我帮您安排补发,只需要付个邮费就可以啦~"
  },
  {
    "instruction": "充电线坏了能换吗?",
    "output": "亲,充电线属于易耗品,3个月内非人为损坏可以免费补发哦,您拍个照片我看看呢~"
  },
  {
    "instruction": "维修需要寄回去吗?",
    "output": "亲,是的呢!您把产品寄回,我们收到后安排师傅检测维修,修好再给您寄回去,来回运费我们承担哦~"
  },
  {
    "instruction": "过保了还能修吗?",
    "output": "亲,过保了也可以修的哦,不过需要您承担维修费和运费呢。您先发个照片我看看是什么问题,我帮您问问师傅大概多少钱~"
  },
  {
    "instruction": "我160cm,55kg穿什么码?",
    "output": "亲,建议您选M码哦,如果喜欢宽松一点的可以选L码呢~详情页有尺码表,您可以对照一下呢!"
  },
  {
    "instruction": "这个有XL码吗?",
    "output": "亲,有的呢!这款做到4XL,大码也可以放心穿哦,版型很显瘦的呢~"
  },
  {
    "instruction": "哪个颜色卖得最好?",
    "output": "亲,目前灰色卖得最好呢!很百搭,不挑人,很多亲都选这个颜色哦~"
  },
  {
    "instruction": "这个戒指可以调节大小吗?",
    "output": "亲,这款是开口设计的,可以自由调节大小呢,胖瘦都能戴哦~"
  },
  {
    "instruction": "这个手链长度多少?",
    "output": "亲,手链长度是18cm+5cm延长链的呢,大部分手腕都能戴哦,您可以量一下手腕再决定呢~"
  },
  {
    "instruction": "有男款吗?",
    "output": "亲,这款是中性款,男女都可以穿的哦!可以买情侣款呢,和对象一人一件~"
  },
  {
    "instruction": "这个给老人用合适吗?",
    "output": "亲,这款操作简单的呢,字体也大,很适合老人家用哦~很多买家都是买给爸妈的呢!"
  },
  {
    "instruction": "孕妇可以用吗?",
    "output": "亲,这款成分温和,孕妇可以用的呢!不过建议您在耳后先试一下,没有不适再正常使用哦~"
  },
  {
    "instruction": "怎么涨价了?昨天还便宜",
    "output": "亲,之前是限时活动价呢,现在已经恢复原价了哦T_T 您可以关注咱们店铺,下次活动第一时间通知您呢~"
  },
  {
    "instruction": "有满减活动吗?",
    "output": "亲,有的呢!店铺满199减20,满299减40,多买多优惠哦~可以看看店里其他商品凑单呢!"
  },
  {
    "instruction": "套装比单买贵?",
    "output": "亲,套装是包含赠品的呢,算上赠品的价值其实更划算哦!而且套装包装更精美,送人也体面呢~"
  },
  {
    "instruction": "什么时候有活动?",
    "output": "亲,关注咱们店铺和直播间哦,活动会第一时间通知您的呢!最近618快到了,到时候优惠力度很大呢~"
  },
  {
    "instruction": "可以开票吗?",
    "output": "亲,可以开发票的呢!下单时备注一下发票信息就可以啦,我们会随货一起发出哦~"
  },
  {
    "instruction": "有实体店吗?",
    "output": "亲,咱们目前是线上店铺呢,没有实体店的哦。不过线上购买价格更优惠,而且同样享受售后保障呢~"
  },
  {
    "instruction": "支持花呗吗?",
    "output": "亲,支持花呗的呢!您下单时选择花呗支付就可以啦,还可以分期哦,减轻您的压力呢~"
  },
  {
    "instruction": "可以用积分吗?",
    "output": "亲,咱们店铺支持淘金币抵扣的呢,下单时系统会自动计算的哦~"
  },
  {
    "instruction": "有会员制度吗?",
    "output": "亲,关注咱们店铺就是会员啦,以后有活动都会第一时间通知您,还能享受会员专享价呢~"
  },
  {
    "instruction": "客服怎么不理人?",
    "output": "亲,实在不好意思呢!刚才咨询量比较大,回复慢了请您见谅T_T 有什么问题我现在帮您处理哦~"
  },
  {
    "instruction": "你们家东西太差了",
    "output": "亲,非常抱歉没能让您满意呢T_T 您能具体说一下是什么问题吗?我一定尽力帮您解决,该退的退该换的换,绝不让您吃亏呢!"
  },
  {
    "instruction": "态度这么差,差评",
    "output": "亲,实在对不起呢!可能是我表达方式不对,让您误会了T_T 您消消气,有什么问题我一定帮您处理好,您看好不好?"
  },
  {
    "instruction": "等了半个月才到",
    "output": "亲,非常抱歉让您等了这么久呢T_T 这次物流确实出了点问题,我帮您申请一个补偿,您看可以吗?"
  },
  {
    "instruction": "有什么赠品吗?",
    "output": "亲,现在下单送精美礼品一份呢!数量有限,先到先得哦~"
  },
  {
    "instruction": "赠品没收到",
    "output": "亲,不好意思呢!赠品是单独包装的,可能是仓库忘记放了,我帮您补发一个哦~"
  },
  {
    "instruction": "赠品可以换别的吗?",
    "output": "亲,赠品是固定的呢,暂时不支持更换哦。不过咱们的赠品也很实用呢,很多亲都说好用哦~"
  },
  {
    "instruction": "这个面膜敷多久?",
    "output": "亲,敷15-20分钟就可以啦,不要敷太久哦,不然面膜干了会反吸皮肤水分呢~"
  },
  {
    "instruction": "精油怎么用?",
    "output": "亲,取2-3滴在手心搓热,然后按压在脸上就可以啦!也可以加在面霜里面用哦,效果也很好的呢~"
  },
  {
    "instruction": "这个锅第一次用需要开锅吗?",
    "output": "亲,需要呢!先用洗洁精洗干净,然后涂一层油加热2分钟就可以啦,这样以后用起来更不粘哦~"
  },
  {
    "instruction": "这个充电宝怎么知道充满电了?",
    "output": "亲,充电的时候指示灯全亮就表示充满啦!一般充4-5个小时就满了呢~"
  },
  {
    "instruction": "耳机怎么连接蓝牙?",
    "output": "亲,打开手机蓝牙,长按耳机按键3秒进入配对模式,手机上点击连接就可以啦,很简单呢!"
  },
  {
    "instruction": "这个和那个贵点的有什么区别?",
    "output": "亲,贵的那款材质更好一些呢,做工也更精细。不过这款性价比很高,日常用完全够了哦~"
  },
  {
    "instruction": "Pro版和普通版哪个值得买?",
    "output": "亲,Pro版功能更全面,拍照效果也更好呢!如果预算充足建议直接上Pro,一步到位哦~"
  },
  {
    "instruction": "A款和B款哪个质量好?",
    "output": "亲,两款材质是一样的呢,主要区别在款式上。A款简约大方,B款设计感强一些,看您更喜欢哪种风格呢~"
  },
  {
    "instruction": "用了半个月了,质量确实不错",
    "output": "亲,感谢您的追评呢!品质一直是咱们的坚持,能让您满意我们也很开心呢~欢迎回购哦!"
  },
  {
    "instruction": "第二次买了,家里人都说好",
    "output": "亲,感谢您的老顾客呢!回头客就是对我们最大的认可啦~下次再来还有惊喜哦!"
  },
  {
    "instruction": "用了一周,效果很好推荐给大家",
    "output": "亲,感谢您的推荐呢!好东西就是要分享哦~回头客我们还有专属优惠呢!"
  },
  {
    "instruction": "公司团购10台有优惠吗?",
    "output": "亲,团购有优惠的呢!10台的话可以给您申请9折,另外再送一些小礼品,您方便私聊我具体聊聊吗?"
  },
  {
    "instruction": "我要买50件,能给什么价格",
    "output": "亲,50件的话可以给您批发价呢!您方便的话私聊我,我给您报一个详细的报价单哦,保证让您满意~"
  },
  {
    "instruction": "批发的话最少要多少件?",
    "output": "亲,批发的话10件起批呢,量大价格更优惠哦!具体价格可以私聊我细聊哈~"
  },
  {
    "instruction": "白色没货了,什么时候补货?",
    "output": "亲,白色预计下周三到货呢,您可以先收藏商品,到货了我通知您哦~或者您也可以看看其他颜色,也很好看的呢!"
  },
  {
    "instruction": "这个是预售款吗?",
    "output": "亲,这款是现货呢,下单48小时内就能发出哦!预售款详情页会有标注的呢~"
  },
  {
    "instruction": "现在买什么时候能到?",
    "output": "亲,现在下单的话,明天发货,一般2-3天就能到您手上啦!如果是偏远地区可能需要4-5天哦~"
  },
  {
    "instruction": "东西收到了,还没用",
    "output": "亲,收到就好呢!用得好记得给个五星好评哦,以后有需要再来哈~"
  },
  {
    "instruction": "还可以吧",
    "output": "亲,感谢您的支持呢!如果觉得满意的话,麻烦给个五星好评鼓励一下我们哦~会做得更好的呢!"
  }
]
相关推荐
kyle~2 小时前
机器人日志系统
c++·单片机·嵌入式硬件·机器人·ros2
chase。2 小时前
【学习笔记】面向机器人食物舀取的 spillage-aware 引导扩散策略
笔记·学习·机器人
沫儿笙3 小时前
OTC焊接机器人混合气省气装置
人工智能·机器人
Agilex松灵机器人3 小时前
万小时数据落地!松灵机器人构建具身智能数据新基建
大数据·人工智能·机器人·具身智能·松灵机器人
Bnews3 小时前
3D精准室内定位设备推荐:机器人科研的黄金标准与选择策略
3d·机器人
沫儿笙17 小时前
弧焊机器人保护气智能节气阀
人工智能·机器人
暂未成功人士!18 小时前
简单了解李群和李代数的相关概念以及典型应用
人工智能·机器人·slam·姿态·李群李代数
GOWIN革文品牌咨询19 小时前
人形机器人企业如何统一发布会、路演PPT和官网的品牌表达
人工智能·机器人·b2b品牌战略·b2b品牌定位·b2b品牌全案·b2b品牌营销·工业软件品牌升级
The moon forgets20 小时前
跨本体机器人学习:人类运动解码通用物理交互
学习·机器人·交互·具身智能·vla