如何使用Python和Anvil构建一个问答网络应用程序
问答式网络应用程序已经存在了一段时间了。一个很好的例子是在网站上使用机器人,用户提出一个问题,答案就会自动生成。
在这个构建中,我们将向读者展示如何使用HuggingFace和Anvil上的一个预训练模型构建一个问答应用。
Anvil是一个开源的网络界面,允许开发者使用Python启动和部署网络应用。它与开发人员使用的流行的Gradio网络应用程序非常相似。我们将利用Anvil来构建我们的前端。
前提条件
要跟上进度,你需要具备以下条件
- 对自然语言处理的理解。
- 对机器学习建模的理解。
- 谷歌Colab或Jupyter笔记本。
安装和导入依赖项
我们要安装的第一个依赖是PyTorch。
!pip3 install torch==1.10.2+cu113 torchvision==0.11.3+cu113 torchaudio==0.10.2+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
我们要安装的下一个依赖项是Transformers。这是一个NLP库,允许我们使用HuggingFace的模型。
!pip install transformers
这就是我们将在本教程中使用的两个主要依赖项。让我们继续,从Transformers中导入标记器、管道和模型。
from transformers import AutoModelForQuestionAnswering, AutoTokenizer, pipeline
- NLP模型使用
AutoTokenizer,将自然语言转换为标记词。 AutoModelForQuestionAnswering允许我们加载我们的模型。pipeline允许我们使用该模型。
我们现在可以去设置我们的模型了。
设置深度学习NLP模型
让我们从创建问答管道开始。
model = 'deepset/roberta-base-squad2'
nlp_pipeline = pipeline('question-answering', model= model, tokenizer= model)
当你运行上面的代码时,它将会把模型下载到你的笔记本上。
你不必使用我们在本教程中使用的相同模型。我们选择了
deepset/roberta-base-squad2,因为它是最受欢迎的。但是,HuggingFace上有许多问题回答模型。你也可以自由地尝试使用任何其他模型。
为了使用这个模型,我们需要传入一个字典。对于这个字典,我们需要传入两样东西。一个问题和一些背景。
我们创建一个名为random_text 的变量,以保存一些从维基百科随机获取的文本。我们将把这个变量传递给context 。
random_text = """
<To avoid plagiarism flags, please refer to the linked Google Colab URL to access the random text gotten from Wikipedia>
"""
QA_set = {
'question':'What is machine learning?',
'context': random_text
}
让我们继续在我们的管道中测试这一点。
nlp_pipeline(QA_set)
结果。
{'answer': 'computer algorithms that can improve automatically through experience and by the use of data',
'end': 131,
'score': 0.06677386909723282,
'start': 39}
令人印象深刻吧?让我们再传一个问题。
QA_set = {
'question':'Where are machine learning algorithms used?',
'context': random_text
}
结果。
{'answer': 'medicine, email filtering, speech recognition, and computer vision',
'end': 509,
'score': 0.27500787377357483,
'start': 443}
这个模型似乎是通过简单地从段落中获取上下文来给我们答案的。这很好。我们可以再往前走一步。我们可以建立一个网络界面,使用户能够轻松地与模型互动。这就是Anvil派上用场的地方。
将模型与Anvil应用程序整合
Anvil是一个完全用Python构建全栈网络应用的平台。它使构建和部署全栈机器学习应用变得容易。它易于使用并且是开源的。我们将在这次构建中使用该框架。
要使用它,请到他们的网站上,点击网页右上角的start building 按钮。当然,你需要注册才能访问该应用程序。如果你已经有了你的登录信息,你可以继续登录。如果你没有,你可以先注册再登录。这是免费的。
登录成功后,创建一个新的空白应用程序。你会被提示选择你所选择的主题。我们为这个构建选择了Material Design theme 。
如果你以前使用过WordPress的拖放功能,构建前端是非常相似的。
这是我们想出的设计。

现在我们的设计已经准备好了,我们需要回到我们的Google Colab并从那里连接到Anvil。
连接到Anvil
我们首先安装名为anvil-uplink 的主要依赖项。它允许我们将我们的Colab连接到Anvil应用程序。
!pip install anvil-uplink
与之前的安装一样,我们把它导入到我们的Colab。
import anvil.server
下一步涉及连接到Anvil服务器。
anvil.server.connect('<Add your Anvil code here>')
下面的截图显示了你可以在应用程序上获得Anvil代码的地方。

点击Uplink 选项。将出现一个弹出窗口,如下图所示。

最后,你需要启用Enable the Anvil Server Uplink for this app 按钮来获取代码。
当你运行代码时,你应该看到下面的信息,显示你已经成功连接到服务器。
Connecting to wss://anvil.works/uplink
Anvil websocket open
Connected to "Default environment" as SERVER
现在,我们需要设置一个可调用的函数,Anvil应用程序可以调用该函数与我们的Google Colab对话。此外,我们的Colab将使用该函数来连接到NLP模型。
设置一个可调用的函数
我们首先定义一个装饰器,告诉服务器这是一个可调用函数。
@anvil.server.callable
接下来,我们将定义这个函数以连接到我们的NLP模型。
def question_answer(question_text, context_text):
QA_set = {
'question':question_text,
'context': context_text
}
让我们通过NLP管道运行它,并将结果存储在一个名为results 的变量内。
results = nlp(QA_set)
最后,我们返回answer 。请记住,结果是一个包含answer 、end 、score 和start 的字典。你可以使用type(results) ,确认它返回一个字典。
return results['answer']
在我们的Anvil应用程序中,在代码部分,添加以下函数。
def primary_color_1_click(self, **event_args):
input_text = self.input_text.text
question_text = self.question_text.text
result = anvil.server.call('question_answer', question_text, input_text)
self.answer_text.text = result
这将我们的模型与我们在Anvil应用程序上创建的元素连接起来。
测试该应用程序
在Anvil应用中,点击Run 按钮。挑选任何段落并将其粘贴到输入区。你可以问任何你想让模型返回答案的问题。最后,点击ASK A QUESTION 按钮。
下面是我们的结果。

我们已经成功建立了一个问答网络应用。
总结
这就是我们从零开始构建的问答网络应用。它是相对简单的。
如果你想将该网络应用程序部署给更多人,你可以使用Anvil应用右上角的Publish this app 。它将生成一个私人链接,你可以向你的用户展示或嵌入到你的网站上。