在本文中,将探讨如何利用Python、Flask和Haystack框架,结合Docker技术,构建一个功能完备、高度可扩展和可定制的问答系统。Haystack框架提供了完整的问答功能,包括但不限于全文检索、相似度评分和文本嵌入的向量存储。将以Medium规则文档作为目标文档,并进行模型的微调。
在开始之前,需要具备以下基础知识:Elasticsearch和Docker。本文提供的代码可以直接使用Docker构建。
本文将介绍文档存储的设置、API代码解释、在Docker中构建Flask API、从API加载数据、API演示、模型微调、代码调整以及结果总结。
Haystack框架允许向文档存储发起查询,文档存储中包含了多种选项,如ElasticsearchDocumentStore、SQLDocumentStore和InMemoryDocumentStore。本文将使用推荐的Elasticsearch,它预装了全文查询、BM25检索和文本嵌入的向量存储等功能。
# 安装Elasticsearch的命令
安装完成后,可以通过浏览以下URL来验证安装是否成功。如果安装成功,将显示如下内容:
Haystack框架主要由三个基本组件构成:文档存储、检索器和阅读器,需要根据需求选择合适的组件。
文档存储:本文推荐使用ElasticsearchDocumentStore,它预装了全文查询、BM25检索和向量存储等功能。在索引之前,应将文档分割成更小的单元(例如段落),以使检索器返回的结果更加精细和准确。
检索器:需要根据嵌入的相似度来显示答案,因此DensePassageRetriever是一个强大的选择,用于评分文本的相似度。
阅读器:本文将使用Farm Reader,如果需要Transformer阅读器,可以使用“distilbert-base-uncased-distilled-squad”模型以获得更好的准确性。
#Flask应用结构
以下是main.py的主要代码解释。在本文中,将使用Elasticsearch文档。应用配置如下所示:
# 实现上传PDF文档的端点
实现查询端点,并从Elasticsearch文档返回相关的答案。搜索查询期间需要提供索引。
使用以下命令构建Docker镜像:
docker build -t qna:v1 .
使用以下命令在Docker容器中构建并运行FlaskAPI:
docker run — name qna_app -d -p 8777:8777 xxxxxxxxx
注意:xxxxxxxxx是镜像ID。使用以下命令确认Docker容器:
docker ps
现在问答API成功运行在http://localhost:8777。
准备一个PDF文档,该文档将上传到Elasticsearch文档中。准备好PDF文档后,使用API上传如下:
# 验证上传的文档
使用qna_pretrain端点提出问题。目前,只使用了预训练模型“distilbert-base-uncased-distilled-squad”,它提供了良好的准确性。在下一篇文章中,将展示如何注释和改进模型。
# 使用API查询问题的示例
尝试根据需求改进模型并自行训练。对于任何特定领域的训练,需要使用Haystack注释工具来标记数据。
# 注释工具的使用
创建账户并上传txt文档。按照以下快照注释问题和答案:
# 导出标签为SQUAD格式的“answers.json”
将文件复制到Docker容器中:
# 代码解释util-trainer.py
收集训练标签后,这个Python实用程序将帮助根据需求训练和微调模型。让进行10个周期的训练。
# 从Docker容器执行训练的命令
训练完成后,模型将保存在train_model目录中。现在训练成功完成。
修改代码以订阅训练和预训练模型在同一端点。将添加额外的参数“mode”以分类模型。
# 将代码发布到Docker容器
现在重启容器以反映API中的更改:
docker restart qna_app
现在API已准备好订阅训练和预训练模型。
# 使用API比较模型的示例