如何限制ChatGPT仅围绕指定主题作答?Dart代码优化求助
问题分析与解决方案
你的代码无法实现主题限制,核心问题在于消息角色的顺序和使用错误,以及提示指令不够明确,导致AI无法正确理解并执行主题限制规则。
核心问题点
- 错误地将用户提问设置为
assistant角色:assistant角色用于存放AI的历史回复,用户的提问必须放在user角色中。 - 重复且混乱的系统提示:同时在
system和user角色中放入相同规则提示,会干扰AI对指令优先级的判断。 - 提示规则不够明确:未清晰定义AI遇到无关问题时的具体响应方式,AI可能会模糊处理。
修正后的Dart代码
Future<(ChatGtpResponseModel?, ChatErrorResponseModel?)> getChatGtpResponse(String content) async { final headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer $apiKey', 'OpenAI-Organization': 'org-SOMETHING' }; var data = jsonEncode(ChatGtpRequestModel( model: 'gpt-4', messages: [ // 系统提示:放在最前面,定义AI核心角色与规则 Message( role: 'system', content: '你是一个聪明、风趣且友好的助手,仅专注于分享与颜色相关的信息。' '如果遇到与颜色无关的问题(如数学计算、非颜色类知识查询等),' '请直接回复:"抱歉,我只能回答与颜色相关的问题,请提问相关内容。"', ), // 用户实际提问:必须放在user角色中 Message(role: 'user', content: content), ], temperature: 0, // 温度设为0,确保AI严格遵循规则,减少随机性 )); final url = Uri.parse('https://api.openai.com/v1/chat/completions'); final res = await http.post(url, headers: headers, body: data); if (res.statusCode != 200) { var model = ChatErrorResponseModel.fromJson(json.decode(res.body)); return (null, model); } var model = ChatGtpResponseModel.fromJson(json.decode(res.body)); return (model, null); }
额外优化建议
- 添加Few-Shot示例强化规则:在系统提示后加入示例对话,让AI更清晰地理解边界:
messages: [ Message(role: 'system', content: '你是专注于颜色主题的助手,仅回答与颜色相关的问题,无关问题直接拒绝。'), // 示例1:有效问题 Message(role: 'user', content: '太阳是什么颜色?'), Message(role: 'assistant', content: '太阳的颜色会因大气散射等因素变化,通常我们看到的是白色,正午时接近淡黄色,日落时呈橙红色。'), // 示例2:无关问题 Message(role: 'user', content: '1+2等于多少?'), Message(role: 'assistant', content: '抱歉,我只能回答与颜色相关的问题,请提问相关内容。'), // 用户当前提问 Message(role: 'user', content: content), ] - 保持严格参数设置:维持
temperature: 0,确保AI输出的确定性,避免偏离规则。
内容的提问来源于stack exchange,提问作者Hussain Murtaza
相关产品推荐
相关产品推荐

