问题提取器 🧐
大型语言模型可以通过一组问题和答案进行指令调优。 然而,要在自己的数据上进一步微调模型,你需要大量关于你的数据的问题和答案。 手动生成这些问题和答案可能需要大量工作。
这个仓库让你可以使用未经微调的语言模型(ChatGPT)从现有的文本数据中自动提取问题/答案对,消除所有手动工作。
安装
要运行此代码,你需要克隆这个仓库,然后安装以下Python包:
tiktoken
,OpenAI的分词器,openai
,官方OpenAI API客户端,langchain
,用于组合模型和实用工具的胶水代码。
使用方法
这个脚本旨在将一个包含markdown(.md
)文档的文件夹转换为一个.json
文件,其中包含问题、答案和用于生成它们的源文档路径的列表。
要运行代码,请在question_extractor.py
文件中设置相关的文件路径(输入文件夹和输出路径),并确保你的OpenAI API密钥在环境中。
然后用Python运行脚本:
python3 question_extractor.py
完成后,所有问题/答案将作为.json
文件写入输出路径。
内部工作原理
代码遍历所有文件,对每个文件使用以下提示后跟一段文本来提取问题列表:
你是一位专家用户,正在提取信息以测验人们对文档的了解。你将收到从文档中提取的一页内容,请写出一个编号列表,列出仅基于给定文本可以回答的问题。
然后它遍历这些问题,通过传递以下提示后跟一段文本和一个问题来生成答案:
你是一位回答问题的专家用户。你将收到从文档中提取的一页内容和一个问题。请仅基于给定文本生成一个全面而富有信息的答案。
代码的大部分实际逻辑都用于并发处理文件(以提高速度)并确保传递给模型的文本块足够小,以留出足够的标记用于回答。
如果文本太长而无法发送给模型,它会沿着最高级别的markdown标题进行分割(如果需要,可以重复这个过程,直到拆分到单个段落)。
就性能而言,这个脚本可以在6分钟内处理完整的NERSC文档1。 将318个markdown文件转换为8005个问题,花费29美元。
潜在改进
- 使用GPT4进行问题回答,以提高答案质量,但会导致运行时间更长和成本显著增加
- 保存中间结果,以便能够重新启动中断的任务
- 直接使用OpenAI客户端,而不是Langchain,以减少依赖
Footnotes
-
以模型速率限制的约93%运行。 ↩