├── README.assets ├── ChatGPT大模型支持微调的介绍.png ├── ChatGPT微调开始训练的邮件通知.png ├── 在OpenAI-Playground上试用.png └── 检查ChatGPT微调数据集格式.png ├── README.md ├── check_dataset.py ├── data ├── demo_data_法律咨询.jsonl └── fine_tuning.jsonl ├── fine_tuning.py ├── get_fine_tuning_status.py ├── make_dataset.py ├── upload_dataset.py └── use_fine_tuning_model.py /README.assets/ChatGPT大模型支持微调的介绍.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Logistic98/chatgpt-fine-tuning/78a178a1b11c53cb8a2f860fa970127451da9fd5/README.assets/ChatGPT大模型支持微调的介绍.png -------------------------------------------------------------------------------- /README.assets/ChatGPT微调开始训练的邮件通知.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Logistic98/chatgpt-fine-tuning/78a178a1b11c53cb8a2f860fa970127451da9fd5/README.assets/ChatGPT微调开始训练的邮件通知.png -------------------------------------------------------------------------------- /README.assets/在OpenAI-Playground上试用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Logistic98/chatgpt-fine-tuning/78a178a1b11c53cb8a2f860fa970127451da9fd5/README.assets/在OpenAI-Playground上试用.png -------------------------------------------------------------------------------- /README.assets/检查ChatGPT微调数据集格式.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Logistic98/chatgpt-fine-tuning/78a178a1b11c53cb8a2f860fa970127451da9fd5/README.assets/检查ChatGPT微调数据集格式.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 1. ChatGPT大模型微调示例 2 | 3 | 2023 年 8 月 22 日,OpenAI宣布支持对ChatGPT大模型进行微调了。OpenAI的基座模型本身已经非常出色,通过微调,即使样本数量很少也可以获得良好效果,使得其他模型难以竞争。然而,数据安全性的问题仍未解决,用户数据最终会流向OpenAI,这对于安全性要求高的用户来说是个问题,因此训练本地私有化模型仍然有必要。 4 | 5 | 微调不仅可以提供更高质量的结果,还可以训练更多范例、节省Token和降低请求延迟。GPT模型通过prompt有效使用,而微调则进一步改善了少样本学习,实现了更好的结果。微调的过程包括准备和上传训练数据、训练新的微调模型和使用微调模型,从而节约成本并实现低延迟请求。 6 | 7 | ![ChatGPT大模型支持微调的介绍](README.assets/ChatGPT大模型支持微调的介绍.png) 8 | 9 | ### 1.1 准备ChatGPT-KEY的付费账号 10 | 11 | 前提条件:ChatGPT大模型微调需要 OpenAI 的 API-KEY,而且要求这个账号必须是付费过的,新账号的白嫖额度是不能用的(第三方购买的很多廉价账号都是机器批量注册的新账号,都是不能用的),会在创建微调时报错。这是必须的条件,没有就不用往下看了。 12 | 13 | ### 1.2 准备并上传微调数据集 14 | 15 | #### 1.2.1 制作微调数据集 16 | 17 | 以法律方向的微调为例,我这里只是为了走通流程,偷个懒就不自己制作微调数据集了。 18 | 19 | 原始数据集从 [ChatLaw](https://github.com/PKU-YuanGroup/ChatLaw) 项目中进行下载,通过如下脚本,将其转换成 gpt-3.5-turbo 微调所需的数据格式。 20 | 21 | make_dataset.py 22 | 23 | ```python 24 | # -*- coding: utf-8 -*- 25 | 26 | import json 27 | 28 | # 从demo_data_法律咨询.jsonl文件中读取数据 29 | # 来源:https://github.com/PKU-YuanGroup/ChatLaw/blob/main/data/demo_data_%E6%B3%95%E5%BE%8B%E5%92%A8%E8%AF%A2.jsonl 30 | data = [] 31 | with open('./data/demo_data_法律咨询.jsonl', 'r', encoding='utf-8') as file: 32 | for line in file: 33 | data.append(json.loads(line)) 34 | 35 | # 转换格式变成 gpt-3.5-turbo 微调所需的数据格式 36 | formatted_data = [] 37 | for entry in data: 38 | meta_instruction = entry["meta_instruction"].replace("你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:", "你一个人工智能法律助理:") 39 | messages = [] 40 | messages.append({ 41 | "role": "system", 42 | "content": meta_instruction 43 | }) 44 | for chat in entry["chat"]: 45 | messages.append({ 46 | "role": "user", 47 | "content": chat["咨询者"] 48 | }) 49 | messages.append({ 50 | "role": "assistant", 51 | "content": chat["ChatLAW"] 52 | }) 53 | formatted_data.append({ 54 | "messages": messages 55 | }) 56 | 57 | # 将结果写入到fine_tuning.jsonl文件中 58 | with open('./data/fine_tuning.jsonl', 'w', encoding='utf-8') as file: 59 | for item in formatted_data: 60 | file.write(json.dumps(item, ensure_ascii=False)) 61 | file.write('\n') 62 | ``` 63 | 64 | #### 1.2.2 检查微调数据集格式 65 | 66 | 制作完数据集后,使用官方脚本(我这里把注释和print内容翻译成中文了)校验一下数据集格式是否符合要求。 67 | 68 | check_dataset.py 69 | 70 | ```python 71 | # -*- coding: utf-8 -*- 72 | 73 | import json 74 | import tiktoken 75 | import numpy as np 76 | from collections import defaultdict 77 | 78 | # 指定数据路径并打开JSONL文件 79 | data_path = "./data/fine_tuning.jsonl" 80 | 81 | # 加载数据集 82 | with open(data_path) as f: 83 | dataset = [json.loads(line) for line in f] 84 | 85 | # 通过检查示例数量和第一项来快速查看数据 86 | print("示例数量:", len(dataset)) 87 | print("第一个示例:") 88 | for message in dataset[0]["messages"]: 89 | print(message) 90 | 91 | # 我们需要遍历所有不同的示例,确保格式正确,并符合Chat completions消息结构 92 | format_errors = defaultdict(int) 93 | 94 | for ex in dataset: 95 | if not isinstance(ex, dict): 96 | format_errors["data_type"] += 1 97 | continue 98 | 99 | messages = ex.get("messages", None) 100 | if not messages: 101 | format_errors["missing_messages_list"] += 1 102 | continue 103 | 104 | for message in messages: 105 | if "role" not in message or "content" not in message: 106 | format_errors["message_missing_key"] += 1 107 | 108 | if any(k not in ("role", "content", "name") for k in message): 109 | format_errors["message_unrecognized_key"] += 1 110 | 111 | if message.get("role", None) not in ("system", "user", "assistant"): 112 | format_errors["unrecognized_role"] += 1 113 | 114 | content = message.get("content", None) 115 | if not content or not isinstance(content, str): 116 | format_errors["missing_content"] += 1 117 | 118 | if not any(message.get("role", None) == "assistant" for message in messages): 119 | format_errors["example_missing_assistant_message"] += 1 120 | 121 | if format_errors: 122 | print("发现错误:") 123 | for k, v in format_errors.items(): 124 | print(f"{k}: {v}") 125 | else: 126 | print("未发现错误") 127 | 128 | # 除了消息的结构,我们还需要确保长度不超过4096个令牌限制 129 | 130 | # 计数令牌功能 131 | encoding = tiktoken.get_encoding("cl100k_base") 132 | 133 | 134 | # 不精确!简化自https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb 135 | def num_tokens_from_messages(messages, tokens_per_message=3, tokens_per_name=1): 136 | num_tokens = 0 137 | for message in messages: 138 | num_tokens += tokens_per_message 139 | for key, value in message.items(): 140 | num_tokens += len(encoding.encode(value)) 141 | if key == "name": 142 | num_tokens += tokens_per_name 143 | num_tokens += 3 144 | return num_tokens 145 | 146 | 147 | def num_assistant_tokens_from_messages(messages): 148 | num_tokens = 0 149 | for message in messages: 150 | if message["role"] == "assistant": 151 | num_tokens += len(encoding.encode(message["content"])) 152 | return num_tokens 153 | 154 | 155 | def print_distribution(values, name): 156 | print(f"\n#### {name}的分布:") 157 | print(f"最小值 / 最大值: {min(values)}, {max(values)}") 158 | print(f"平均值 / 中位数: {np.mean(values)}, {np.median(values)}") 159 | print(f"p5 / p95: {np.quantile(values, 0.1)}, {np.quantile(values, 0.9)}") 160 | 161 | # 最后,我们可以在创建微调作业之前查看不同格式操作的结果: 162 | 163 | # 警告和令牌计数 164 | n_missing_system = 0 165 | n_missing_user = 0 166 | n_messages = [] 167 | convo_lens = [] 168 | assistant_message_lens = [] 169 | 170 | for ex in dataset: 171 | messages = ex["messages"] 172 | if not any(message["role"] == "system" for message in messages): 173 | n_missing_system += 1 174 | if not any(message["role"] == "user" for message in messages): 175 | n_missing_user += 1 176 | n_messages.append(len(messages)) 177 | convo_lens.append(num_tokens_from_messages(messages)) 178 | assistant_message_lens.append(num_assistant_tokens_from_messages(messages)) 179 | 180 | print("缺少系统消息的示例数量:", n_missing_system) 181 | print("缺少用户消息的示例数量:", n_missing_user) 182 | print_distribution(n_messages, "每个示例的消息数量") 183 | print_distribution(convo_lens, "每个示例的总令牌数量") 184 | print_distribution(assistant_message_lens, "每个示例的助理令牌数量") 185 | n_too_long = sum(l > 4096 for l in convo_lens) 186 | print(f"\n{n_too_long}个示例可能超过4096个令牌限制,微调期间将被截断") 187 | 188 | # 定价和默认n_epochs估计 189 | MAX_TOKENS_PER_EXAMPLE = 4096 190 | MIN_TARGET_EXAMPLES = 100 191 | MAX_TARGET_EXAMPLES = 25000 192 | TARGET_EPOCHS = 3 193 | MIN_EPOCHS = 1 194 | MAX_EPOCHS = 25 195 | 196 | n_epochs = TARGET_EPOCHS 197 | n_train_examples = len(dataset) 198 | if n_train_examples * TARGET_EPOCHS < MIN_TARGET_EXAMPLES: 199 | n_epochs = min(MAX_EPOCHS, MIN_TARGET_EXAMPLES // n_train_examples) 200 | elif n_train_examples * TARGET_EPOCHS > MAX_TARGET_EXAMPLES: 201 | n_epochs = max(MIN_EPOCHS, MAX_TARGET_EXAMPLES // n_train_examples) 202 | n_billing_tokens_in_dataset = sum(min(MAX_TOKENS_PER_EXAMPLE, length) for length in convo_lens) 203 | 204 | print(f"数据集包含约{n_billing_tokens_in_dataset}个将在训练期间收费的令牌") 205 | print(f"默认情况下,您将对此数据集进行{n_epochs}个时代的训练") 206 | print(f"默认情况下,您将为约{n_epochs * n_billing_tokens_in_dataset}个令牌收费") 207 | print("请参阅定价页面以估算总成本") 208 | ``` 209 | 210 | 数据集是符合要求的,输出内容如下: 211 | 212 | ![检查ChatGPT微调数据集格式](README.assets/检查ChatGPT微调数据集格式.png) 213 | 214 | #### 1.2.3 上传微调数据集 215 | 216 | 填写你的 OpenAI API-KEY,上传微调数据集,这里需要记录下 training_file.id,下面的微调任务会用到。 217 | 218 | upload_dataset.py 219 | 220 | ```python 221 | # -*- coding: utf-8 -*- 222 | 223 | import openai 224 | openai.api_key = "your_openai_api_key" 225 | 226 | # 上传训练数据集 227 | training_file = openai.File.create( 228 | file=open("./data/fine_tuning.jsonl", "rb"), 229 | purpose="fine-tune" 230 | ) 231 | 232 | # file.id要复制下来,下一步开始微调要用 233 | print(training_file.id) 234 | ``` 235 | 236 | ### 1.3 创建微调任务并完成微调 237 | 238 | #### 1.3.1 创建微调任务 239 | 240 | 上传完微调数据集之后,就可以创建微调任务了。首先执行如下命令更新一下 openai 包,旧版没有FineTuningJob功能。 241 | 242 | ``` 243 | $ pip3 install --upgrade openai 244 | ``` 245 | 246 | 之后填写 OpenAI API-KEY 及上一步得到的 training_file.id,开始微调训练。 247 | 248 | ```python 249 | # -*- coding: utf-8 -*- 250 | 251 | import openai 252 | openai.api_key = "your_openai_api_key" 253 | 254 | # 创建微调模型 255 | openai.FineTuningJob.create(training_file="your_training_file_id", model="gpt-3.5-turbo") 256 | ``` 257 | 258 | #### 1.3.2 微调过程中查看状态 259 | 260 | 微调过程中,可以查看作业列表、作业状态、作业事件等信息,并可以随时取消作业。 261 | 262 | get_fine_tuning_status.py 263 | 264 | ```python 265 | # -*- coding: utf-8 -*- 266 | 267 | import openai 268 | openai.api_key = "your_openai_api_key" 269 | 270 | print("===列出10个微调作业") 271 | print(openai.FineTuningJob.list(limit=10)) 272 | 273 | print("===检索微调作业的状态") 274 | print(openai.FineTuningJob.retrieve("your_ftjob_id")) 275 | 276 | print("===列出最多10个来自微调作业的事件") 277 | print(openai.FineTuningJob.list_events(id="your_ftjob_id", limit=10)) 278 | 279 | # print("===取消作业") 280 | # print(openai.FineTuningJob.cancel("your_ftjob_id")) 281 | ``` 282 | 283 | 部分输出内容如下: 284 | 285 | ```json 286 | ===检索微调作业的状态 287 | { 288 | "object": "fine_tuning.job", 289 | "id": "ftjob-5XsithSRiJ6mvf24IP9xq7eW", 290 | "model": "gpt-3.5-turbo-0613", 291 | "created_at": 1692941148, 292 | "finished_at": 1692941721, 293 | "fine_tuned_model": "ft:gpt-3.5-turbo-0613:personal::7rJlWrzp", 294 | "organization_id": "org-sE6KS2sIIgrV8cmzJYQCkfDA", 295 | "result_files": [ 296 | "file-x0qLLS90VDNV3Xk3EEhA3iFB" 297 | ], 298 | "status": "succeeded", 299 | "validation_file": null, 300 | "training_file": "file-LX7MRoSwB7je9yuC4FydIgV5", 301 | "hyperparameters": { 302 | "n_epochs": 5 303 | }, 304 | "trained_tokens": 26100 305 | } 306 | ``` 307 | 308 | 微调训练完成后,OpenAI官方会给你发送邮件通知: 309 | 310 | ![ChatGPT微调完成的邮件通知](README.assets/ChatGPT微调开始训练的邮件通知.png) 311 | 312 | ### 1.4 使用微调模型 313 | 314 | #### 1.4.1 在OpenAI Playground上试用 315 | 316 | 点开邮件通知的 OpenAI Playground 链接,在 USER 处输入问题,点击 Submit 按钮提交,在线预览微调效果。 317 | 318 | ![在OpenAI-Playground上试用](README.assets/在OpenAI-Playground上试用.png) 319 | 320 | #### 1.4.2 使用API在代码里应用 321 | 322 | model 可以通过上文“检查微调作业的状态”的输出里获取 fine_tuned_model,也可以从 OpenAI Playground 链接的路径里获取。 323 | 324 | use_fine_tuning_model.py 325 | 326 | ```python 327 | # -*- coding: utf-8 -*- 328 | 329 | import openai 330 | openai.api_key = "your_openai_api_key" 331 | 332 | completion = openai.ChatCompletion.create( 333 | model="ft:gpt-3.5-turbo:my-org:custom_suffix:id", 334 | messages=[ 335 | {"role": "user", "content": "如果有人擅自破坏水库闸门,但没有造成重大损失,是否构成决水罪?"} 336 | ] 337 | ) 338 | 339 | print(completion.choices[0].message) 340 | ``` 341 | 342 | 运行结果: 343 | 344 | ```json 345 | { 346 | "role": "assistant", 347 | "content": "根据《中华人民共和国刑法》第一百一十一条的规定,故意破坏水利设施,罪行轻微的,处三年以下有期徒刑、拘役或者管制。具体来说,破坏水库闸门案件中,如果被告人故意破坏水库闸门,但是没有造成重大损失,属于罪行轻微的情形,构成故意破坏水利设施罪。" 348 | } 349 | ``` 350 | 351 | -------------------------------------------------------------------------------- /check_dataset.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import json 4 | import tiktoken 5 | import numpy as np 6 | from collections import defaultdict 7 | 8 | # 指定数据路径并打开JSONL文件 9 | data_path = "./data/fine_tuning.jsonl" 10 | 11 | # 加载数据集 12 | with open(data_path) as f: 13 | dataset = [json.loads(line) for line in f] 14 | 15 | # 通过检查示例数量和第一项来快速查看数据 16 | print("示例数量:", len(dataset)) 17 | print("第一个示例:") 18 | for message in dataset[0]["messages"]: 19 | print(message) 20 | 21 | # 我们需要遍历所有不同的示例,确保格式正确,并符合Chat completions消息结构 22 | format_errors = defaultdict(int) 23 | 24 | for ex in dataset: 25 | if not isinstance(ex, dict): 26 | format_errors["data_type"] += 1 27 | continue 28 | 29 | messages = ex.get("messages", None) 30 | if not messages: 31 | format_errors["missing_messages_list"] += 1 32 | continue 33 | 34 | for message in messages: 35 | if "role" not in message or "content" not in message: 36 | format_errors["message_missing_key"] += 1 37 | 38 | if any(k not in ("role", "content", "name") for k in message): 39 | format_errors["message_unrecognized_key"] += 1 40 | 41 | if message.get("role", None) not in ("system", "user", "assistant"): 42 | format_errors["unrecognized_role"] += 1 43 | 44 | content = message.get("content", None) 45 | if not content or not isinstance(content, str): 46 | format_errors["missing_content"] += 1 47 | 48 | if not any(message.get("role", None) == "assistant" for message in messages): 49 | format_errors["example_missing_assistant_message"] += 1 50 | 51 | if format_errors: 52 | print("发现错误:") 53 | for k, v in format_errors.items(): 54 | print(f"{k}: {v}") 55 | else: 56 | print("未发现错误") 57 | 58 | # 除了消息的结构,我们还需要确保长度不超过4096个令牌限制 59 | 60 | # 计数令牌功能 61 | encoding = tiktoken.get_encoding("cl100k_base") 62 | 63 | 64 | # 不精确!简化自https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb 65 | def num_tokens_from_messages(messages, tokens_per_message=3, tokens_per_name=1): 66 | num_tokens = 0 67 | for message in messages: 68 | num_tokens += tokens_per_message 69 | for key, value in message.items(): 70 | num_tokens += len(encoding.encode(value)) 71 | if key == "name": 72 | num_tokens += tokens_per_name 73 | num_tokens += 3 74 | return num_tokens 75 | 76 | 77 | def num_assistant_tokens_from_messages(messages): 78 | num_tokens = 0 79 | for message in messages: 80 | if message["role"] == "assistant": 81 | num_tokens += len(encoding.encode(message["content"])) 82 | return num_tokens 83 | 84 | 85 | def print_distribution(values, name): 86 | print(f"\n#### {name}的分布:") 87 | print(f"最小值 / 最大值: {min(values)}, {max(values)}") 88 | print(f"平均值 / 中位数: {np.mean(values)}, {np.median(values)}") 89 | print(f"p5 / p95: {np.quantile(values, 0.1)}, {np.quantile(values, 0.9)}") 90 | 91 | # 最后,我们可以在创建微调作业之前查看不同格式操作的结果: 92 | 93 | # 警告和令牌计数 94 | n_missing_system = 0 95 | n_missing_user = 0 96 | n_messages = [] 97 | convo_lens = [] 98 | assistant_message_lens = [] 99 | 100 | for ex in dataset: 101 | messages = ex["messages"] 102 | if not any(message["role"] == "system" for message in messages): 103 | n_missing_system += 1 104 | if not any(message["role"] == "user" for message in messages): 105 | n_missing_user += 1 106 | n_messages.append(len(messages)) 107 | convo_lens.append(num_tokens_from_messages(messages)) 108 | assistant_message_lens.append(num_assistant_tokens_from_messages(messages)) 109 | 110 | print("缺少系统消息的示例数量:", n_missing_system) 111 | print("缺少用户消息的示例数量:", n_missing_user) 112 | print_distribution(n_messages, "每个示例的消息数量") 113 | print_distribution(convo_lens, "每个示例的总令牌数量") 114 | print_distribution(assistant_message_lens, "每个示例的助理令牌数量") 115 | n_too_long = sum(l > 4096 for l in convo_lens) 116 | print(f"\n{n_too_long}个示例可能超过4096个令牌限制,微调期间将被截断") 117 | 118 | # 定价和默认n_epochs估计 119 | MAX_TOKENS_PER_EXAMPLE = 4096 120 | MIN_TARGET_EXAMPLES = 100 121 | MAX_TARGET_EXAMPLES = 25000 122 | TARGET_EPOCHS = 3 123 | MIN_EPOCHS = 1 124 | MAX_EPOCHS = 25 125 | 126 | n_epochs = TARGET_EPOCHS 127 | n_train_examples = len(dataset) 128 | if n_train_examples * TARGET_EPOCHS < MIN_TARGET_EXAMPLES: 129 | n_epochs = min(MAX_EPOCHS, MIN_TARGET_EXAMPLES // n_train_examples) 130 | elif n_train_examples * TARGET_EPOCHS > MAX_TARGET_EXAMPLES: 131 | n_epochs = max(MIN_EPOCHS, MAX_TARGET_EXAMPLES // n_train_examples) 132 | n_billing_tokens_in_dataset = sum(min(MAX_TOKENS_PER_EXAMPLE, length) for length in convo_lens) 133 | 134 | print(f"数据集包含约{n_billing_tokens_in_dataset}个将在训练期间收费的令牌") 135 | print(f"默认情况下,您将对此数据集进行{n_epochs}个时代的训练") 136 | print(f"默认情况下,您将为约{n_epochs * n_billing_tokens_in_dataset}个令牌收费") 137 | print("请参阅定价页面以估算总成本") -------------------------------------------------------------------------------- /data/demo_data_法律咨询.jsonl: -------------------------------------------------------------------------------- 1 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果一个外国人在中国策动或帮助中国公民投敌叛变,会被如何处罚?", "ChatLAW": "外国人策动或帮助中国公民投敌叛变的,应以投敌叛变罪的共犯论处。具体的刑罚应根据其具体行为的性质、情节等进行裁量。"}], "subject": "法律咨询"} 2 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果一个未成年人参与投敌叛变行为,会被如何处罚?", "ChatLAW": "未成年人在达到法定刑事责任年龄前犯罪,应当依法适用少年保护法的相关规定进行处理,具体包括教育、改造、感化等。"}], "subject": "法律咨询"} 3 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "一个中国公民被外国势力控制,在被迫的情况下投降敌人,是否构成投敌叛变罪?", "ChatLAW": "如果行为人被迫投降敌人,不能认定其具有故意危害国家安全的意图,不构成投敌叛变罪。"}], "subject": "法律咨询"} 4 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "一个中国公民在不知情的情况下被外国情报机构收买并被控制,后被迫投降敌人,是否构成投敌叛变罪?", "ChatLAW": "如果行为人被收买、被控制后被迫投降敌人,不能认定其具有故意危害国家安全的意图,不构成投敌叛变罪。"}], "subject": "法律咨询"} 5 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果一个人在境外与敌对国家或敌方联络,但并未实施投敌叛变行为,是否构成投敌叛变罪?", "ChatLAW": "如果行为人只是在境外与敌对国家或敌方联络,但并未实施投敌叛变行为,不能认定其构成投敌叛变罪。但如果其行为已经涉及到危害国家安全的行为,应当依法追究其法律责任。"}], "subject": "法律咨询"} 6 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果一个中国公民在战时向国外武装力量提供非军事物资,是否构成资敌罪?", "ChatLAW": "不构成资敌罪。根据《刑法》第一百一十二条规定,资敌罪的客体是人民民主专政的政权和社会主义制度,主观方面表现为故意,客观方面表现为向敌人提供武器装备或者军用物资的行为。而对于向国外武装力量提供非军事物资,不属于资敌罪的构成要件,因为该行为并未直接为敌人提供军事支援。"}], "subject": "法律咨询"} 7 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果一个外国人在我国战时向国外武装力量提供武器装备,是否构成资敌罪?", "ChatLAW": "不构成资敌罪。根据《刑法》第一百一十二条规定,资敌罪主体只能是我国公民,外国人、无国籍人不能成为资敌罪主体。因此,外国人在我国战时向国外武装力量提供武器装备,不构成资敌罪。"}], "subject": "法律咨询"} 8 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果一个中国公民在战时向国内敌人提供非军事物资,是否构成资敌罪?", "ChatLAW": "不构成资敌罪。根据《刑法》第一百一十二条规定,敌人包括国内敌人和国外敌人,但资敌罪的客体是人民民主专政的政权和社会主义制度。因此,向国内敌人提供非军事物资不属于资敌罪的构成要件。"}], "subject": "法律咨询"} 9 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果一个中国公民在战时向敌人提供军用物资,但是是无意识的,是否构成资敌罪?", "ChatLAW": "不构成资敌罪。根据《刑法》第一百一十二条规定,资敌罪主观方面表现为故意,因此,如果提供军用物资是无意识的,即使客观上符合资敌罪的构成要件,也不构成资敌罪。"}], "subject": "法律咨询"} 10 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果一个中国公民向敌人提供军用物资,但是是为了保护自己或者他人的生命财产安全,是否构成资敌罪?", "ChatLAW": "不构成资敌罪。根据《刑法》第一百一十二条规定,资敌罪主观方面表现为故意,如果提供军用物资是出于保护自己或者他人的生命财产安全的需要,主观上并未具备故意,因此不构成资敌罪。"}], "subject": "法律咨询"} 11 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果一群村民为争夺水资源,擅自扒开水渠放水,导致农田被淹,这是否构成决水罪?", "ChatLAW": "不能一概都认定为犯罪。区分这种行为是否构成决水罪的关键是要看行为人的行为是否危及公共安全,即是否造成或可能造成不特定多数人的伤亡或重大公私财产的毁损,如果没有造成也不可能造成不特定多数人的伤亡和重大公私财产的毁损,即不危及公共安全的,则行为人的行为不构成决水罪,不能以犯罪论处。对于一般的决水行为,主要是依靠民事的或行政的方法加以解决。"}], "subject": "法律咨询"} 12 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果有人擅自开闸放水,使得河道水位上升,但没有造成重大损失,是否构成决水罪?", "ChatLAW": "决水罪必须危害公共安全,才能构成犯罪。如果决水行为不足以危害不特定多数人的生命、健康或重大公私财产的安全,如个人擅自开闸放水,尚不足以危害公共安全的,不应以决水罪论处。"}], "subject": "法律咨询"} 13 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果有人擅自破坏水库闸门,但没有造成重大损失,是否构成决水罪?", "ChatLAW": "决水罪必须危害公共安全,才能构成犯罪。如果行为人的行为不足以危害不特定多数人的生命、健康或重大公私财产的安全,如擅自破坏水库闸门,尚不足以危害公共安全的,不应以决水罪论处。"}], "subject": "法律咨询"} 14 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果有人为报复单位或个人,制造水患,是否构成决水罪?", "ChatLAW": "制造水患属于使用危险方法危害公共安全的行为,属于决水罪的范畴。如果行为人的行为危害公共安全,即危及多人的生命、健康或者有使公私财产遭受重大损失的现实危险,就视为决水罪构成要件齐备。"}], "subject": "法律咨询"} 15 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果有人故意制造水患,但未造成严重后果,是否构成决水罪?", "ChatLAW": "如果行为人的行为危害公共安全,即危及多人的生命、健康或者有使公私财产遭受重大损失的现实危险,即使尚未造成严重后果,也构成决水罪。"}], "subject": "法律咨询"} 16 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果我不小心破坏了正在使用中的电力设备,但是没有造成严重后果,是否构成过失损坏电力设备罪?", "ChatLAW": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪必须造成致人重伤、死亡或者使公私财产遭受重大损失的严重后果,才能构成犯罪。如果你不小心破坏了正在使用中的电力设备,但是没有造成严重后果,则不构成该罪。"}], "subject": "法律咨询"} 17 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果我在玩耍时,无意中将石子扔到了正在使用中的变压器上,导致变压器的铁壳被破坏,是否构成过失损坏电力设备罪?", "ChatLAW": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪必须造成致人重伤、死亡或者使公私财产遭受重大损失的严重后果,才能构成犯罪。如果你无意中将石子扔到了正在使用中的变压器上,导致变压器的铁壳被破坏,但是没有造成危害公共安全的严重后果,则不构成该罪。"}], "subject": "法律咨询"} 18 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果我无意中破坏了库存的电力设备,是否构成过失损坏电力设备罪?", "ChatLAW": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪的犯罪对象必须是正在使用中的电力设备。如果你无意中破坏了库存的电力设备,而不是正在使用中的电力设备,则不构成该罪。"}], "subject": "法律咨询"} 19 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果我无意中破坏了正在修理中的电力设备,是否构成过失损坏电力设备罪?", "ChatLAW": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪的犯罪对象必须是正在使用中的电力设备。如果你无意中破坏了正在修理中的电力设备,而不是正在使用中的电力设备,则不构成该罪。"}], "subject": "法律咨询"} 20 | {"meta_instruction": "你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。", "plugins": [], "chat": [{"咨询者": "如果我无意中破坏了正在生产中的电力设备,是否构成过失损坏电力设备罪?", "ChatLAW": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪的犯罪对象必须是正在使用中的电力设备。如果你无意中破坏了正在生产中的电力设备,而不是正在使用中的电力设备,则不构成该罪。"}], "subject": "法律咨询"} -------------------------------------------------------------------------------- /data/fine_tuning.jsonl: -------------------------------------------------------------------------------- 1 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果一个外国人在中国策动或帮助中国公民投敌叛变,会被如何处罚?"}, {"role": "assistant", "content": "外国人策动或帮助中国公民投敌叛变的,应以投敌叛变罪的共犯论处。具体的刑罚应根据其具体行为的性质、情节等进行裁量。"}]} 2 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果一个未成年人参与投敌叛变行为,会被如何处罚?"}, {"role": "assistant", "content": "未成年人在达到法定刑事责任年龄前犯罪,应当依法适用少年保护法的相关规定进行处理,具体包括教育、改造、感化等。"}]} 3 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "一个中国公民被外国势力控制,在被迫的情况下投降敌人,是否构成投敌叛变罪?"}, {"role": "assistant", "content": "如果行为人被迫投降敌人,不能认定其具有故意危害国家安全的意图,不构成投敌叛变罪。"}]} 4 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "一个中国公民在不知情的情况下被外国情报机构收买并被控制,后被迫投降敌人,是否构成投敌叛变罪?"}, {"role": "assistant", "content": "如果行为人被收买、被控制后被迫投降敌人,不能认定其具有故意危害国家安全的意图,不构成投敌叛变罪。"}]} 5 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果一个人在境外与敌对国家或敌方联络,但并未实施投敌叛变行为,是否构成投敌叛变罪?"}, {"role": "assistant", "content": "如果行为人只是在境外与敌对国家或敌方联络,但并未实施投敌叛变行为,不能认定其构成投敌叛变罪。但如果其行为已经涉及到危害国家安全的行为,应当依法追究其法律责任。"}]} 6 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果一个中国公民在战时向国外武装力量提供非军事物资,是否构成资敌罪?"}, {"role": "assistant", "content": "不构成资敌罪。根据《刑法》第一百一十二条规定,资敌罪的客体是人民民主专政的政权和社会主义制度,主观方面表现为故意,客观方面表现为向敌人提供武器装备或者军用物资的行为。而对于向国外武装力量提供非军事物资,不属于资敌罪的构成要件,因为该行为并未直接为敌人提供军事支援。"}]} 7 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果一个外国人在我国战时向国外武装力量提供武器装备,是否构成资敌罪?"}, {"role": "assistant", "content": "不构成资敌罪。根据《刑法》第一百一十二条规定,资敌罪主体只能是我国公民,外国人、无国籍人不能成为资敌罪主体。因此,外国人在我国战时向国外武装力量提供武器装备,不构成资敌罪。"}]} 8 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果一个中国公民在战时向国内敌人提供非军事物资,是否构成资敌罪?"}, {"role": "assistant", "content": "不构成资敌罪。根据《刑法》第一百一十二条规定,敌人包括国内敌人和国外敌人,但资敌罪的客体是人民民主专政的政权和社会主义制度。因此,向国内敌人提供非军事物资不属于资敌罪的构成要件。"}]} 9 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果一个中国公民在战时向敌人提供军用物资,但是是无意识的,是否构成资敌罪?"}, {"role": "assistant", "content": "不构成资敌罪。根据《刑法》第一百一十二条规定,资敌罪主观方面表现为故意,因此,如果提供军用物资是无意识的,即使客观上符合资敌罪的构成要件,也不构成资敌罪。"}]} 10 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果一个中国公民向敌人提供军用物资,但是是为了保护自己或者他人的生命财产安全,是否构成资敌罪?"}, {"role": "assistant", "content": "不构成资敌罪。根据《刑法》第一百一十二条规定,资敌罪主观方面表现为故意,如果提供军用物资是出于保护自己或者他人的生命财产安全的需要,主观上并未具备故意,因此不构成资敌罪。"}]} 11 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果一群村民为争夺水资源,擅自扒开水渠放水,导致农田被淹,这是否构成决水罪?"}, {"role": "assistant", "content": "不能一概都认定为犯罪。区分这种行为是否构成决水罪的关键是要看行为人的行为是否危及公共安全,即是否造成或可能造成不特定多数人的伤亡或重大公私财产的毁损,如果没有造成也不可能造成不特定多数人的伤亡和重大公私财产的毁损,即不危及公共安全的,则行为人的行为不构成决水罪,不能以犯罪论处。对于一般的决水行为,主要是依靠民事的或行政的方法加以解决。"}]} 12 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果有人擅自开闸放水,使得河道水位上升,但没有造成重大损失,是否构成决水罪?"}, {"role": "assistant", "content": "决水罪必须危害公共安全,才能构成犯罪。如果决水行为不足以危害不特定多数人的生命、健康或重大公私财产的安全,如个人擅自开闸放水,尚不足以危害公共安全的,不应以决水罪论处。"}]} 13 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果有人擅自破坏水库闸门,但没有造成重大损失,是否构成决水罪?"}, {"role": "assistant", "content": "决水罪必须危害公共安全,才能构成犯罪。如果行为人的行为不足以危害不特定多数人的生命、健康或重大公私财产的安全,如擅自破坏水库闸门,尚不足以危害公共安全的,不应以决水罪论处。"}]} 14 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果有人为报复单位或个人,制造水患,是否构成决水罪?"}, {"role": "assistant", "content": "制造水患属于使用危险方法危害公共安全的行为,属于决水罪的范畴。如果行为人的行为危害公共安全,即危及多人的生命、健康或者有使公私财产遭受重大损失的现实危险,就视为决水罪构成要件齐备。"}]} 15 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果有人故意制造水患,但未造成严重后果,是否构成决水罪?"}, {"role": "assistant", "content": "如果行为人的行为危害公共安全,即危及多人的生命、健康或者有使公私财产遭受重大损失的现实危险,即使尚未造成严重后果,也构成决水罪。"}]} 16 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果我不小心破坏了正在使用中的电力设备,但是没有造成严重后果,是否构成过失损坏电力设备罪?"}, {"role": "assistant", "content": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪必须造成致人重伤、死亡或者使公私财产遭受重大损失的严重后果,才能构成犯罪。如果你不小心破坏了正在使用中的电力设备,但是没有造成严重后果,则不构成该罪。"}]} 17 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果我在玩耍时,无意中将石子扔到了正在使用中的变压器上,导致变压器的铁壳被破坏,是否构成过失损坏电力设备罪?"}, {"role": "assistant", "content": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪必须造成致人重伤、死亡或者使公私财产遭受重大损失的严重后果,才能构成犯罪。如果你无意中将石子扔到了正在使用中的变压器上,导致变压器的铁壳被破坏,但是没有造成危害公共安全的严重后果,则不构成该罪。"}]} 18 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果我无意中破坏了库存的电力设备,是否构成过失损坏电力设备罪?"}, {"role": "assistant", "content": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪的犯罪对象必须是正在使用中的电力设备。如果你无意中破坏了库存的电力设备,而不是正在使用中的电力设备,则不构成该罪。"}]} 19 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果我无意中破坏了正在修理中的电力设备,是否构成过失损坏电力设备罪?"}, {"role": "assistant", "content": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪的犯罪对象必须是正在使用中的电力设备。如果你无意中破坏了正在修理中的电力设备,而不是正在使用中的电力设备,则不构成该罪。"}]} 20 | {"messages": [{"role": "system", "content": "你一个人工智能法律助理:\n- 你旨在提供有无害且准确的回答。\n- 你必须拒绝回答非法的问题。\n- 你的回应不能含糊、指责、粗鲁、有争议、离题或防御性。\n- 你的回应必须有礼貌。"}, {"role": "user", "content": "如果我无意中破坏了正在生产中的电力设备,是否构成过失损坏电力设备罪?"}, {"role": "assistant", "content": "根据《中华人民共和国刑法》第一百一十九条,过失损坏电力设备罪的犯罪对象必须是正在使用中的电力设备。如果你无意中破坏了正在生产中的电力设备,而不是正在使用中的电力设备,则不构成该罪。"}]} 21 | -------------------------------------------------------------------------------- /fine_tuning.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # pip3 install --upgrade openai 旧版的openai没有FineTuningJob功能 4 | import openai 5 | openai.api_key = "your_openai_key" 6 | 7 | # 创建微调模型 8 | openai.FineTuningJob.create(training_file="file-LX7MRoSwB7je9yuC4FydIgV5", model="gpt-3.5-turbo") 9 | -------------------------------------------------------------------------------- /get_fine_tuning_status.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import openai 4 | openai.api_key = "your_openai_key" 5 | 6 | print("===列出10个微调作业") 7 | print(openai.FineTuningJob.list(limit=10)) 8 | 9 | print("===检索微调作业的状态") 10 | print(openai.FineTuningJob.retrieve("ftjob-5XsithSRiJ6mvf24IP9xq7eW")) 11 | 12 | print("===列出最多10个来自微调作业的事件") 13 | print(openai.FineTuningJob.list_events(id="ftjob-5XsithSRiJ6mvf24IP9xq7eW", limit=10)) 14 | 15 | # print("===取消作业") 16 | # print(openai.FineTuningJob.cancel("ftjob-5XsithSRiJ6mvf24IP9xq7eW")) 17 | # 18 | # print("===删除经过微调的模型(必须是创建模型的组织的所有者)") 19 | # print(openai.Model.delete("ftjob-5XsithSRiJ6mvf24IP9xq7eW")) -------------------------------------------------------------------------------- /make_dataset.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import json 4 | 5 | # 从demo_data_法律咨询.jsonl文件中读取数据 6 | # 来源:https://github.com/PKU-YuanGroup/ChatLaw/blob/main/data/demo_data_%E6%B3%95%E5%BE%8B%E5%92%A8%E8%AF%A2.jsonl 7 | data = [] 8 | with open('./data/demo_data_法律咨询.jsonl', 'r', encoding='utf-8') as file: 9 | for line in file: 10 | data.append(json.loads(line)) 11 | 12 | # 转换格式变成 gpt-3.5-turbo 微调所需的数据格式 13 | formatted_data = [] 14 | for entry in data: 15 | meta_instruction = entry["meta_instruction"].replace("你一个名叫ChatLAW,由北京大学团队开发的人工智能助理:", "你一个人工智能法律助理:") 16 | messages = [] 17 | messages.append({ 18 | "role": "system", 19 | "content": meta_instruction 20 | }) 21 | for chat in entry["chat"]: 22 | messages.append({ 23 | "role": "user", 24 | "content": chat["咨询者"] 25 | }) 26 | messages.append({ 27 | "role": "assistant", 28 | "content": chat["ChatLAW"] 29 | }) 30 | formatted_data.append({ 31 | "messages": messages 32 | }) 33 | 34 | # 将结果写入到fine_tuning.jsonl文件中 35 | with open('./data/fine_tuning.jsonl', 'w', encoding='utf-8') as file: 36 | for item in formatted_data: 37 | file.write(json.dumps(item, ensure_ascii=False)) 38 | file.write('\n') 39 | -------------------------------------------------------------------------------- /upload_dataset.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import openai 4 | openai.api_key = "your_openai_key" 5 | 6 | # 上传训练数据集 7 | training_file = openai.File.create( 8 | file=open("./data/fine_tuning.jsonl", "rb"), 9 | purpose="fine-tune" 10 | ) 11 | 12 | # file.id要复制下来,下一步开始微调要用 13 | print(training_file.id) -------------------------------------------------------------------------------- /use_fine_tuning_model.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import openai 4 | openai.api_key = "your_openai_key" 5 | 6 | completion = openai.ChatCompletion.create( 7 | model="ft:gpt-3.5-turbo-0613:personal::7rJlWrzp", 8 | messages=[ 9 | {"role": "user", "content": "如果有人擅自破坏水库闸门,但没有造成重大损失,是否构成决水罪?"} 10 | ] 11 | ) 12 | 13 | print(completion.choices[0].message) 14 | 15 | --------------------------------------------------------------------------------