菜单

用于问答的微调

相关源文件

本文档介绍了使用已弃用的微调方法,以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调用处理每个维基百科部分

  1. 问题生成:提示格式:"Write questions based on the text below\n\nText: {context}\n\nQuestions:\n1."
  2. 答案生成:提示格式:"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 ada
  • 问答模型openai 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() 函数实现了完整的流水线

  1. 上下文检索:使用已弃用的搜索API查找相关部分
  2. Token管理:将上下文限制为max_len个token,并进行元数据跟踪
  3. 答案生成:应用经过微调的模型,并使用适当的提示格式

来源: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