数据读取
首先请到https://platform.deepseek.com/api_keys生成key 填入环境变量
# 请到 https://platform.deepseek.com/api_keys 申请api填入下方,新用户赠送10元额度的token完全支持本次baseline速通~
DEEPSEEK_API_KEY = 'sk-'
# 读取参考数据集
import json,time
from functools import reduce
novel_data = []
with open('./参考数据集.json', 'r',encoding='utf-8') as file:
for line in file:
novel_data.append(json.loads(line))
# 查看数据集中第 1 本小说的名字
novel_data[0]['name']
'三国演义'
# 查看数据集中所有小说的名字和字数
for i in novel_data:
print(f"《{i['name']}》的字数为: {len(i['text'])} 字")
《三国演义》的字数为: 593514 字
《水浒传》的字数为: 838774 字
《儒林外史》的字数为: 327064 字
《呼啸山庄》的字数为: 215931 字
《百年孤独》的字数为: 246912 字
《西游记》的字数为: 714847 字
《红与黑》的字数为: 361019 字
《战争与和平》的字数为: 1056718 字
《聊斋志异》的字数为: 384606 字
《醒世恒言》的字数为: 328581 字
《傲慢与偏见》的字数为: 218614 字
《红楼梦》的字数为: 789372 字
《隋唐演义》的字数为: 636063 字
《封神演义》的字数为: 588226 字
《拍案惊奇》的字数为: 238248 字
《尤利西斯》的字数为: 363155 字
《福尔摩斯探案集》的字数为: 363914 字
# 读取数据集中第 4 本小说《呼啸山庄》的文本作为训练集数据来源
data = novel_data[3]["text"]
story_name = novel_data[3]["name"]
# 查看《呼啸山庄》全文
data
'一年。我刚刚拜访过我的房东回来——就是那个将要给我惹麻烦的孤独的邻居。这儿可真是一个美丽的乡间!……
数据分块
# 更新pip
!python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
!pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 安装必要的库
!pip install jieba loguru openai
按照800字以内的句子段落划分数据。
# 拆分《呼啸山庄》的文本为 800 字一段的段落
import jieba
# 利用jieba进行句子切分
sentences = []
for sentence in data.split('。'): # 使用句号作为切分符
sentences.append(sentence)
# 将句子合并成800字一段的段落
paragraphs = []
current_paragraph = ''
for sentence in sentences:
if len(current_paragraph) + len(sentence) <= 800:
current_paragraph += sentence+'。'
else:
paragraphs.append(current_paragraph.strip())
current_paragraph = sentence
# 将最后一段加入到段落列表中
if current_paragraph:
paragraphs.append(current_paragraph.strip())
# 打印切分后的段落
for idx, paragraph in enumerate(paragraphs):
print(f'段落 {idx + 1}: {paragraph}')
大模型构建数据集
库导入
# 引入库与日志
from loguru import logger
import json
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
import os
from openai import OpenAI
# 配置loguru输出到文件
logger.remove() # 移除默认的控制台输出
logger.add("logs/app_{time:YYYY-MM-DD}.log", level="INFO", rotation="00:00", retention="10 days", compression="zip")
大模型函数
# 使用deepseek-chat api给段落打标签的接口
def get_response(text):
client = OpenAI(
api_key=DEEPSEEK_API_KEY, # 如果您没有配置环境变量,请在此处用您的API Key进行替换
base_url="https://api.deepseek.com", # 填写DashScope SDK的base_url
)
completion = client.chat.completions.create(
model="deepseek-chat",
messages=[
{
'role': 'system',
'content': '总结user提交的内容。用一句不超过50字的话总结这段小说的情节。仅回答总结,不需要添加其他内容。'
},
{
'role': 'user',
'content': text
}
])
return completion.choices[0].message.content
调用日志打印
# 设置容错机制,可最多重试 5 次,如果失败记录错误日志
def get_summary_with_retry(text):
max_retries = 5
retry_delay = 15 # in seconds
attempts = 0
while attempts < max_retries:
try:
return get_response(text)
except Exception as e:
attempts += 1
if attempts < max_retries:
logger.warning(f"Attempt {attempts} failed for te