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")
运行方式
- 确保TGI服务已启动并监听在
8080端口(若地址不同,修改脚本中TGI_URL) - 将上述代码保存为
test_diversity.py - 执行:
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输出几乎一致,检查服务端是否覆盖了客户端参数(部分部署配置会强制默认值)