本文档介绍了使用已弃用的微调方法,以2020年奥运会数据为例,对OpenAI模型进行微调以基于知识库回答问题的端到端工作流程。对于使用嵌入的现代问答方法,请参阅使用嵌入的问答。对于一般的微调方法,请参阅聊天模型微调。
注意:此方法已被弃用。这些示例依赖于已弃用的API端点,现代推荐的方法使用嵌入来实现检索增强生成(RAG)。
问答微调系统展示了一个三阶段的流水线:从维基百科收集数据、合成问答生成,以及使用对抗性示例进行模型微调。该系统既创建了一个判别器模型(用于判断问题是否可以从上下文中回答),也创建了一个问答模型(用于在存在适当上下文时生成答案)。
来源:examples/fine-tuned_qa/olympics-1-collect-data.ipynb1-523 examples/fine-tuned_qa/olympics-2-create-qa.ipynb1-647 examples/fine-tuned_qa/olympics-3-train-qa.ipynb1-648
数据收集过程提取了关于2020年夏季奥运会的维基百科内容,并将其处理为结构化部分,用于问答生成。
该系统从“2020年夏季奥运会”开始递归爬取维基百科页面,并过滤出与奥运相关的内容
| 功能 | 目的 | 关键参数 |
|---|---|---|
filter_olympic_2020_titles() | 过滤包含“2020”和“olympi”的标题 | 标题列表 |
get_wiki_page() | 检索维基百科页面并处理消歧义 | 标题字符串 |
recursively_find_all_pages() | 递归爬取链接页面 | 标题,已获取标题集合 |
提取过程共生成909个页面,经过过滤并处理成各个部分。
来源:examples/fine-tuned_qa/olympics-1-collect-data.ipynb50-99
extract_sections() 函数处理维基百科标记并创建结构化部分
"==+ .* ==+" 根据标题分割内容GPT2TokenizerFast 计算 token 数量reduce_long() 并结合句子边界检测来截断长部分来源:examples/fine-tuned_qa/olympics-1-collect-data.ipynb128-237 examples/fine-tuned_qa/olympics-1-collect-data.ipynb167-229
该系统使用davinci-instruct模型生成合成问答对,然后创建对抗性示例以训练鲁棒模型。
问答生成使用 temperature=0 以获得一致结果,并通过两次davinci-instruct调用处理每个维基百科部分
"Write questions based on the text below\n\nText: {context}\n\nQuestions:\n1.""Write answer based on the text below\n\nText: {context}\n\nQuestions:\n{questions}\n\nAnswers:\n1."来源:examples/fine-tuned_qa/olympics-2-create-qa.ipynb173-195 examples/fine-tuned_qa/olympics-2-create-qa.ipynb255-276
create_fine_tuning_dataset() 函数创建包含正例和负例的训练数据
| 示例类型 | 创建方法 | 完成 |
|---|---|---|
| 正例 | 正确的问题-上下文对 | 实际答案 |
| 随机负例 | 问题与随机上下文配对 | “没有足够的上下文来回答问题” |
| 同文章负例 | 问题与同一维基百科页面中不同部分的配对 | “没有足够的上下文来回答问题” |
| 语义负例 | 通过搜索获得的最相似上下文的问题 | “没有足够的上下文来回答问题” |
该函数还创建了判别器训练数据,其中包含“是”/“否”完成项,用于上下文相关性分类。
来源:examples/fine-tuned_qa/olympics-3-train-qa.ipynb265-322
该系统使用准备好的数据集训练两个互补模型
训练使用OpenAI的传统微调API,命令如下
openai api fine_tunes.create -t "discriminator_train.jsonl" -v "discriminator_test.jsonl" --batch_size 16 --compute_classification_metrics --classification_positive_class " yes" --model adaopenai api fine_tunes.create -t "qa_train.jsonl" -v "qa_test.jsonl" --batch_size 16来源:examples/fine-tuned_qa/olympics-3-train-qa.ipynb384-403
该系统提供了用于使用微调模型的封装函数
| 功能 | 目的 | 参数 |
|---|---|---|
apply_ft_discriminator() | 评估问题是否可以从上下文中回答 | 上下文、问题、判别器模型 |
apply_ft_qa_answer() | 根据给定上下文生成问题答案 | 上下文、问题、问答模型 |
answer_question_conditionally() | 结合判别器和问答模型(带阈值) | 模型、上下文、问题、对数概率修改器 |
answers_with_ft.py 中的 answer_question() 函数实现了完整的流水线
来源:examples/fine-tuned_qa/answers_with_ft.py16-43 examples/fine-tuned_qa/answers_with_ft.py46-99
训练好的模型根据上下文相关性表现出不同的行为
判别器提供对数概率(log probabilities)用于置信度评估,从而实现基于阈值的决策。
来源:examples/fine-tuned_qa/olympics-3-train-qa.ipynb434-583
这种架构代表了一种完整但已弃用的微调问答方法。现代实现应采用使用嵌入的问答中记录的基于嵌入的方法,以获得更好的性能和成本效益。
来源:examples/fine-tuned_qa/olympics-1-collect-data.ipynb1-523 examples/fine-tuned_qa/olympics-2-create-qa.ipynb1-647 examples/fine-tuned_qa/olympics-3-train-qa.ipynb1-648 examples/fine-tuned_qa/answers_with_ft.py1-160