You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ruDialoGPT-medium的作文生成模型微调后输出异常排查

问题:俄语作文生成模型输出乱码/格式混乱

基于tinkoff-ai/ruDialoGPT-medium模型,用含卡尔·克劳斯主题的俄语作文数据微调后,输入指令Напиши сочинение на тему война(写一篇关于战争的作文)时,模型输出乱码或格式混乱内容,例如_"Война и мир" п. /.",{"topic":"1845_1853","text'。

以下是模型加载代码及生成参数:

模型加载代码

modelpath = 'tinkoff-ai/ruDialoGPT-medium'
tokenizer = AutoTokenizer.from_pretrained(modelpath)
model = AutoModelWithLMHead.from_pretrained('toodles_essays')

生成响应函数及参数

async def generate_response(text):
    inputs = tokenizer(text, return_tensors='pt')
    generated_token_ids = model.generate(
        **inputs,
        top_k=8,
        top_p=0.65,
        num_beams=4,
        num_return_sequences=1,
        do_sample=True,
        no_repeat_ngram_size=2,
        temperature=1.5,
        repetition_penalty=1.5,
        length_penalty=1.0,
        eos_token_id=50256,
        pad_token_id=50256,
        max_new_tokens=40
    )
    response = [tokenizer.decode(sample_token_ids) for sample_token_ids in generated_token_ids][0]
    return response
排查与解决方法

1. 清理微调数据集

乱码输出大概率是微调数据混入了JSON标签、特殊符号等非纯作文内容,模型学到了无效格式:

  • 过滤数据集:移除所有带结构化标签(如{"topic":...})、异常符号的内容,只保留纯俄语作文文本,确保数据格式统一。
  • 重新微调:用清理后的数据集重新训练,避免模型学习无关格式。

2. 调整生成参数

当前参数组合易导致生成不稳定:

  • 降低temperature:1.5的温度会让随机性过强,建议设为0.7-1.0,平衡多样性与合理性。
  • 提升top_k:8的候选词范围过小,模型易被迫生成奇怪词汇,建议调整为30-50。
  • 增加max_new_tokens:仅生成40个token可能未进入正常作文逻辑就截断,建议设为200-500。
  • 统一生成逻辑:同时开启do_sample=True和num_beams=4会冲突,二选一即可——追求多样性用采样,追求连贯性用beam search。

3. 确保分词器与模型匹配

微调与加载阶段必须使用同一分词器:

  • 微调时务必用tinkoff-ai/ruDialoGPT-medium对应的分词器,加载模型时保持一致,避免token映射不匹配导致解码乱码。

4. 优化解码逻辑

修改解码步骤,过滤输入指令和特殊符号:

async def generate_response(text):
    inputs = tokenizer(text, return_tensors='pt')
    generated_token_ids = model.generate(
        **inputs,
        top_k=30,
        top_p=0.8,
        num_beams=4,
        num_return_sequences=1,
        do_sample=False,
        no_repeat_ngram_size=2,
        temperature=0.8,
        repetition_penalty=1.2,
        length_penalty=1.0,
        eos_token_id=tokenizer.eos_token_id,
        pad_token_id=tokenizer.pad_token_id,
        max_new_tokens=300
    )
    # 只截取新生成内容,跳过输入和特殊符号
    input_len = inputs['input_ids'].shape[1]
    response = tokenizer.decode(generated_token_ids[0][input_len:], skip_special_tokens=True)
    return response

内容的提问来源于stack exchange,提问作者Ubuty_programmist_7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:40:28