如何用OpenAI微调功能构建问答系统?训练模型响应异常求助
用OpenAI Fine-tuning构建问答系统及PHP调用问题修复
一、构建问答系统的核心步骤
- 准备标准化训练数据
必须采用JSONL格式,每条数据包含prompt和completion字段,且格式严格统一。示例:
注意:prompt结尾要加固定分隔符(如{"prompt": "问题:什么是OpenAI微调?\n回答:", "completion": "它是通过自定义数据集调整预训练模型,使其适配特定任务的技术。\n\n###"}\n回答:),completion结尾加停止序列(如\n\n###),帮助模型明确问题与回答的边界。 - 上传数据集
使用OpenAI CLI工具执行命令:
执行后获取文件ID,用于后续微调任务。openai api files.create --file your_training_data.jsonl --purpose fine-tune - 创建微调任务
执行命令启动微调,指定训练文件和基础模型:
等待任务完成后,获取生成的微调模型ID。openai api fine_tunes.create --training-file [你的文件ID] --model davinci - 测试微调模型
调用API时必须指定微调后的模型ID,且prompt格式要与训练数据保持一致。
二、PHP调用API的问题修复
问题根源
- 代码中调用的是基础
davinci模型,而非你训练后的微调模型,导致输出格式不匹配,无answers字段,仅返回text内容。 - 训练数据格式不规范,模型未学习到预期的输出逻辑,导致回答与问题无关。
具体修复方案
- 替换模型ID
在PHP代码中将模型参数改为你的微调模型ID:$data = [ 'model' => 'davinci:ft-your-org-20240520-123456', // 替换为你的微调模型ID 'prompt' => '问题:[你的问题内容]\n回答:', // 与训练数据prompt格式一致 'max_tokens' => 100, 'stop' => ['\n\n###'] // 与训练时设置的停止序列一致 ]; - 调整输出处理逻辑
微调模型的响应结果会存在于choices[0]['text']中,修改代码逻辑不再检查answers数组:$apiResponse = // 你的API请求返回内容 $response = json_decode($apiResponse, true); if (isset($response['choices'][0]['text'])) { $answer = trim($response['choices'][0]['text']); echo "回答:" . $answer; } else { echo "未获取到有效回答"; } - 校验训练数据
重新检查训练数据的格式一致性,确保所有prompt和completion的分隔符、停止序列完全统一,避免模型输出混乱。
内容的提问来源于stack exchange,提问作者user16249416
相关产品推荐
相关产品推荐

