3. 调整生成参数控制输出多样性

任务目标

使用TGI(Text Generation Inference)服务,通过调整temperature、top_p、top_k三个核心采样参数,观察同一提示词下生成文本的多样性变化,并记录不同参数组合对应的输出结果。

环境与依赖

  • 已部署的TGI服务(本地或远程),支持兼容接口或TGI原生HTTP接口
  • Python 3.8+,安装requests库(pip install requests)
  • 本文使用TGI原生接口/generate,请求格式为JSON

关键实现

以下脚本向TGI服务发送同一提示词,分别使用三组参数组合进行生成,并打印输出结果。每组参数重复生成2次以观察组内随机性。

import requests
import json
import time

# TGI服务地址(根据实际部署修改)
TGI_URL = "http://localhost:8080/generate"

# 固定提示词
PROMPT = "人工智能的未来发展将"

# 参数组合:temperature / top_p / top_k
PARAM_SETS = [
    {"name": "低温确定性", "temperature": 0.1, "top_p": 0.9, "top_k": 50},
    {"name": "中温平衡",   "temperature": 0.8, "top_p": 0.9, "top_k": 50},
    {"name": "高温多样",   "temperature": 1.5, "top_p": 0.95, "top_k": 100},
]

def generate(prompt, params):
    """调用TGI生成接口,返回文本"""
    payload = {
        "inputs": prompt,
        "parameters": {
            "max_new_tokens": 80,
            "temperature": params["temperature"],
            "top_p": params["top_p"],
            "top_k": params["top_k"],
            "do_sample": True,   # 必须开启采样,参数才生效
        }
    }
    resp = requests.post(TGI_URL, json=payload, timeout=30)
    resp.raise_for_status()
    return resp.json()["generated_text"]

# 执行生成并记录结果
results = {}
for pset in PARAM_SETS:
    outputs = []
    for i in range(2):  # 每组重复2次
        text = generate(PROMPT, pset)
        outputs.append(text)
        time.sleep(0.5)  # 避免请求过快
    results[pset["name"]] = outputs
    print(f"\n=== {pset['name']} (temp={pset['temperature']}) ===")
    for idx, out in enumerate(outputs, 1):
        print(f"  第{idx}次: {out}")

# 保存结果到JSON文件
with open("generation_results.json", "w", encoding="utf-8") as f:
    json.dump({"prompt": PROMPT, "results": results}, f, ensure_ascii=False, indent=2)
print("\n结果已保存至 generation_results.json")

运行方式

  1. 确保TGI服务已启动并监听在8080端口(若地址不同,修改脚本中TGI_URL)
  2. 将上述代码保存为test_diversity.py
  3. 执行:python test_diversity.py

验证方法与判定标准

  • 请求成功:脚本无异常退出,控制台打印6段生成文本(3组参数×2次),且每段文本均以提示词开头
  • 参数生效:temperature=0.1时两次输出高度相似甚至完全相同;temperature=1.5时两次输出差异明显
  • 多样性对比:对比三组输出,高温组的词汇选择与句式变化显著多于低温组,top_k与top_p影响候选词范围
  • 结果记录:当前目录生成generation_results.json,包含提示词与全部输出文本,可用于后续分析

常见问题

  • 返回400错误:检查do_sample是否设为true,部分TGI版本要求显式开启采样
  • 输出为空:确认max_new_tokens值足够大(建议≥50),且模型支持中文生成
  • 结果无差异:若temperature=0.1与1.5输出几乎一致,检查服务端是否覆盖了客户端参数(部分部署配置会强制默认值)
采样参数对生成分布的影响示意 temperature=0.1 top_p=0.9, top_k=50 概率集中,输出稳定 temperature=0.8 top_p=0.9, top_k=50 概率分散,适度多样 temperature=1.5 top_p=0.95, top_k=100 概率平坦,高随机性 温度越高,softmax分布越平坦,低概率词被采样的机会增大,输出多样性提升 top_k限制候选词数量,top_p按累积概率截断候选集,两者共同约束采样空间