这是一个问题生成脚本。借助LLM的能力,我们可以直接从文本中得到问题以及对应的答案。
这个工程计划服务于 驼铃B :ChatHarryPotter。了解驼铃B请点击:TuoLingB
文本获取方式十分多样,并且没有定论。在我们工程目标想打造哈利波特世界的训练数据,因此也就从哈利波特的wiki中提取文档,然后作为本工程的输入。输出的结果组织成问题与答案文本对的json文件,能够直接用于finetune其他的LLM模型。
python download_html.py
由于获取内容多样,并且这个文件类似爬虫,就暂时置空(可能大概就是繁忙与懒惰吧)
实际过程类似使用ChatGPT获取文档段落的问题和答案对(pair),在本工程中,直接使用了Alpaca-Lora 的模型作为LLM,提取问题与答案。
python generate_QAPairs.py --document_file ./HarryPotterDoc/Harry Potter self_v0.1.txt
这个脚本将每一行文本作为一段输入,向LLM询问5个问题(实际测试询问10个问题效果感觉不太稳定)。然后将同样的文本输入作为history,让LLM提供每个问题的答案。
本脚本暂时额外做了一些简单的文本清洗: 对于生成的特别短的问题(len(q) < 3),直接跳过忽略。后续考虑更多的清洗条件。但是实际使用的时候,应用场景的不同,清洗的方式肯定也很不同,需要一个通用的方式进行清洗。因此并不想写很多if else去处理这个问题。待定。
本项目想通过得到的QA对,然后能通过finetune的方式长文本的信息注入到LLM模型中。
- 先通过本工程得到QA对,作为训练数据集
- 利用lora等技术,将信息finetune到模型中
实际上,这种的信息注入方式十分粗浅,但是相对简洁。
类似更高明的方法可以见类似这个文档的做法: 使用 GPT 基于个人文档建立聊天机器人的逐步教程
不过由于需要管理一个外部的知识库,然后每次运行的时候送入指定信息,以实现问题的回答。
但是对于一些专有领域的文档,模型先熟读一遍文档,然后需要的时候再查阅具体段落,会更符合人类的逻辑。
这就可以考虑这两种方式进行结合。不过感觉信息通过QA方式的进行注入,效率还是比较低。 这个可以进一步探讨。
- 多文档(文件夹)QA提取
- 多GPU并行QA生成
- 文档清洗方式