在自然语言处理(NLP)的世界里,问答对(QA pairs)的生成是一个典型任务,它帮助机器理解和回答人类的问题。然而,手动编写这些问答对既费时又低效,特别是当我们需要大量数据来训练机器学习模型时。幸运的是,有了自助问答(self-QA)技术,我们可以自动化这一过程,让模型从给定文本中生成问答对,节省大量时间和劳动力。接下来,我将通过一个简单的教程,一步步展示如何使用这项技术来制备训练数据。
1.什么是Self-QA?
Self-QA是一种利用大型语言模型从文本中自动提取问题和对应答案的技术。这种方法的核心在于,它使用模型的预测能力来创造出和文本内容紧密相关的问题,然后再生成准确的答案。这样不仅提高了数据的质量,还增加了问答对的多样性和覆盖范围。
想象一下,你是一个老师,面前坐着的是一群渴望知识的学生(在我们的案例中,这些学生就是AI模型)。这些学生通过回答问题来学习。Self-QA技术就像是一个无微不至的助教,它从提供的文章中自动提炼出问题并找到答案,这样学生们就可以通过这些问答对进行学习了。
2.Self-QA的应用场景
- 聊天机器人培训:通过反复练习自动生成的问答对,聊天机器人可以更准确地理解并回应人类的提问。
- 教育软件开发:自动生成的问答对可以用来帮助学生复习考试,或提供互动学习的材料。
- 企业内部知识库构建:将公司文档转换为问答对,可以帮助员工快速检索信息,提高工作效率。
3.实现Self-QA技术的执行步骤
- 文本获取与预处理: 我们首先从网上获取文章,就像在数字图书馆中借阅书籍一样。利用
newspaper
库,我们可以轻松下载并解析网页内容。 - 文本分段: 将长文章分割为更小的段落,确保每段都在模型可以高效处理的长度范围内。这就像把一块大蛋糕切成适口的小块,确保每位宾客都能轻松享用。
- 生成QA对: 对于每个独立的文本段落,使用预训练的语言模型生成相关的问答对。这个过程类似于在沙滩上寻找宝藏,每个正确的问答对都是一颗珍珠。
- 数据保存: 所有生成的问答对都将被保存为JSON格式的文件,方便以后的访问和使用。
from newspaper import Article
from transformers import AutoTokenizer, AutoModel
import os
import json
import re
import torch
# 指定gpu显卡
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
SYSTEM_PROMPT = """
你是一个能根据提供的文本内容生成QA对的机器人。以下是你的任务要求:
1. 生成尽可能多的QA对。
2. 每个QA对包含一个问题和一个简洁的答案。
3. 答案必须用简体中文。
4. 生成的QA对不能重复。
5. 使用json格式将QA对包裹起来,问题用"question"表示,答案用"answer"表示。
示例格式:
[
{
"question": "...",
"answer": "..."
},
{
"question": "...",
"answer": "..."
}
]
以下是给定的文本内容:
"""
# 加载模型和分词器
model_dir = "../../../../../chatglm3-6b"
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
model = AutoModel.from_pretrained(model_dir, trust_remote_code=True).half().cuda()
# 设置模型为评估模式
model = model.eval()
# 使用newspaper库从网上抓取文章,并使用以下函数解析文章内容:
def get_article_text(url):
a = Article(url)
try:
a.download()
a.parse()
return a.text
except Exception as e:
print(f"url解析失败,错误原因:{e}")
return ""
# 中文文本分段处理
def split_text(text, maxlength=512):
# 根据中文标点符号分段,确保每段文本长度不超过最大长度限制
sentences = re.split('([。])', text)
segments = []
current_segment = ""
for i in range(0, len(sentences) - 1, 2):
# sentences[i] 表示列表中的句子部分
# sentences[i+1] 表示随后的标点符号部分
# 如果句子是列表中的最后一个元素,它后面可能没有标点符号
sentence = sentences[i] + (sentences[i + 1] if i + 1 < len(sentences) else "")
if len(current_segment) + len(sentence) <= maxlength:
current_segment += sentence
else:
segments.append(current_segment)
current_segment = sentence
if current_segment:
segments.append(current_segment)
return segments
def main():
url = "https://olympics.com/athlete365/zh-hans/%e8%ba%ab%e5%bf%83%e5%81%a5%e5%ba%b7/%e5%85%b3%e7%88%b1%e5%bf%83%e7%90%86%e5%81%a5%e5%ba%b7%e7%9a%84%e6%96%b9%e6%b3%95/"
content = get_article_text(url)
if content != "":
segments = split_text(content)
qa_pairs = []
history = []
# 生成QA对
for segment in segments:
prompt = SYSTEM_PROMPT + f"{segment} 请开始生成 QA 对:"
qa_text, history = model.chat(tokenizer, prompt, history=history)
qa_data = json.loads(qa_text)
qa_pairs.extend(qa_data)
print(qa_pairs)
script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, "QA_extension.json")
with open(file_path, "w", encoding="utf-8") as f:
json.dump(qa_pairs, f, ensure_ascii=False, indent=4)
print("QA对已保存至QA_extension.json文件")
else:
print("获取文章内容失败")
if __name__ == '__main__':
main()
QA_extension.json:
[
{
"question": "什么是精神的力量?",
"answer": "精神的力量是指个体内心所具有的积极、向上的、有助于应对困境和压力的能力。它可以帮助人们保持心理平衡,增强心理适应性和抗压能力。通过培养良好的心理素质,人们可以更好地应对生活中的挑战和困难。"
},
{
"question": "如何辨识压力源?",
"answer": "辨识压力源需要了解自己的生活习惯、性格特点和心理状况,观察自己的情绪变化,并注意自己的身体反应。一些常见的压力源包括工作压力、学习压力、家庭关系紧张、人际关系问题、生活事件(如失业、离婚、疾病)等。通过识别压力源,人们可以采取有效的应对措施,减轻心理压力和负担。"
},
{
"question": "抑郁症症状有哪些?",
"answer": "抑郁症症状表现为持续的悲伤、哭泣、烦躁、睡眠或食欲改变、悲观、郁郁寡欢、内疚、自我厌恶、失败感、疲劳和/或自残想法。这些症状可能会出现在精英运动员生活的各个时期,包括顺境和困境。通过了解这些症状,人们可以及时采取措施,减轻心理压力和负担,避免病情恶化。"
},
{
"question": "如何通过了解自己的压力源和触发因素来找到新的自我管理方法?",
"answer": "了解自己的压力源和触发因素可以帮助人们找到更好的自我管理方法。首先,人们需要识别自己的压力源,然后观察自己的情绪和身体反应,以便了解自己的心理状况。接下来,人们可以尝试不同的自我管理方法,如放松技巧、认知行为疗法、心理咨询等,以应对压力和情绪变化。最后,人们需要持续地调整和完善自己的自我管理方法,以保持心理平衡和健康。"
},
{
"question": "什么是需要避免的情况、经历、人或事物?",
"answer": "需要避免的情况、经历、人或事物是指那些会增加压力或引发心理健康症状(如感到焦虑、抑郁或需要用酒精或药物来应对)的情况、经历、人或事物。这些因素可能包括工作压力、学习压力、家庭关系紧张、人际关系问题、生活事件(如失业、离婚、疾病)等。通过避免这些情况、经历或与这些人或事物保持距离,人们可以降低压力水平,保持心理健康。"
},
{
"question": "如何识别心理健康症状?",
"answer": "识别心理健康症状需要关注自己的情绪和行为变化,观察是否有持续的悲伤、哭泣、烦躁、睡眠或食欲改变、悲观、郁郁寡欢、内疚、自我厌恶、失败感、疲劳和/或自残想法等表现。如果出现这些症状,人们应该及时寻求帮助和支持,避免病情恶化。"
},
{
"question": "如何应对心理健康症状?",
"answer": "应对心理健康症状的方法包括寻求帮助和支持、采用积极的应对策略、保持良好的生活习惯和心理素质。首先,人们应该寻求专业心理咨询或治疗,以获得专业的帮助和支持。其次,人们可以采用积极的应对策略,如放松技巧、认知行为疗法、心理咨询等,以应对压力和情绪变化。最后,人们需要保持良好的生活习惯和心理素质,如保持规律的作息时间、进行适当的锻炼、保持积极的人际关系等,以增强心理适应性和抗压能力。"
}
]