构建问答API:Python、Flask与Haystack框架

在本文中,将探讨如何利用PythonFlask和Haystack框架,结合Docker技术,构建一个功能完备、高度可扩展和可定制的问答系统。Haystack框架提供了完整的问答功能,包括但不限于全文检索、相似度评分和文本嵌入的向量存储。将以Medium规则文档作为目标文档,并进行模型的微调。

基础知识要求

在开始之前,需要具备以下基础知识:Elasticsearch和Docker。本文提供的代码可以直接使用Docker构建。

本文将介绍文档存储的设置、API代码解释、在Docker中构建Flask API、从API加载数据、API演示、模型微调、代码调整以及结果总结。

1. 文档存储设置

Haystack框架允许向文档存储发起查询,文档存储中包含了多种选项,如ElasticsearchDocumentStore、SQLDocumentStore和InMemoryDocumentStore。本文将使用推荐的Elasticsearch,它预装了全文查询、BM25检索和文本嵌入的向量存储等功能。

# 安装Elasticsearch的命令

安装完成后,可以通过浏览以下URL来验证安装是否成功。如果安装成功,将显示如下内容:

2. API代码解释

Haystack框架主要由三个基本组件构成:文档存储、检索器和阅读器,需要根据需求选择合适的组件。

文档存储:本文推荐使用ElasticsearchDocumentStore,它预装了全文查询、BM25检索和向量存储等功能。在索引之前,应将文档分割成更小的单元(例如段落),以使检索器返回的结果更加精细和准确。

检索器:需要根据嵌入的相似度来显示答案,因此DensePassageRetriever是一个强大的选择,用于评分文本的相似度。

阅读器:本文将使用Farm Reader,如果需要Transformer阅读器,可以使用“distilbert-base-uncased-distilled-squad”模型以获得更好的准确性。

#Flask应用结构

以下是main.py的主要代码解释。在本文中,将使用Elasticsearch文档。应用配置如下所示:

# 实现上传PDF文档的端点

实现查询端点,并从Elasticsearch文档返回相关的答案。搜索查询期间需要提供索引。

3. 在Docker中构建Flask API

使用以下命令构建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。

4. 从API加载数据

准备一个PDF文档,该文档将上传到Elasticsearch文档中。准备好PDF文档后,使用API上传如下:

# 验证上传的文档

5. API演示

使用qna_pretrain端点提出问题。目前,只使用了预训练模型“distilbert-base-uncased-distilled-squad”,它提供了良好的准确性。在下一篇文章中,将展示如何注释和改进模型。

# 使用API查询问题的示例

6. 模型微调

尝试根据需求改进模型并自行训练。对于任何特定领域的训练,需要使用Haystack注释工具来标记数据。

# 注释工具的使用

创建账户并上传txt文档。按照以下快照注释问题和答案:

# 导出标签为SQUAD格式的“answers.json”

将文件复制到Docker容器中:

# 代码解释util-trainer.py

收集训练标签后,这个Python实用程序将帮助根据需求训练和微调模型。让进行10个周期的训练。

# 从Docker容器执行训练的命令

训练完成后,模型将保存在train_model目录中。现在训练成功完成。

修改代码以订阅训练和预训练模型在同一端点。将添加额外的参数“mode”以分类模型。

# 将代码发布到Docker容器

现在重启容器以反映API中的更改:

docker restart qna_app

现在API已准备好订阅训练和预训练模型。

# 使用API比较模型的示例
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485