1

我正在使用 AllenNLP 构建一个 Flask 测试预测器。

我将 .json 文件中的“段落”和“问题”传递给预测器。

但是,当我使用 curl 传递 json 文件时,它不会返回响应。在 Flask 中是否有特殊的回报来获得它?

代码如下:

 from allennlp.predictors.predictor import Predictor as AllenNLPPredictor


from flask import Flask
from flask import request
app = Flask(__name__)

@app.route("/", methods=['GET','POST'])
def hello():
    return "<h1>Test app!</h1>"


class PythonPredictor:
    def __init__(self, config):
        self.predictor = AllenNLPPredictor.from_path(
            "https://storage.googleapis.com/allennlp-public-models/bidaf-elmo-model-2018.11.30-charpad.tar.gz"
        )

    def predict(self, payload):
        if request.method == "POST":
            prediction = self.predictor.predict(
                passage=payload["passage"], question=payload["question"]
            )
            return prediction["best_span_str"]

卷曲命令看起来像: curl http://127.0.0.1:5000 -X POST -H "Content-Type: application/json" -d @sample.json

4

1 回答 1

2

除非我误解了(我猜你是在问如何在你的路由中获取 JSON 提交,并返回结果)听起来你需要做类似的事情:

p = PythonPredictor()

@app.route("/", methods=['POST'])
def hello():
    data = request.get_json()
    result = p.predict(data)
    return result

这有效地sample.json通过您的PythonPredictor.predict方法运行您的数据,并将该预测返回给客户端。

请注意,此代码在路由函数之外创建实例p,因此 NLP 模型仅在您的烧瓶应用程序启动时加载(而不是在每个请求上)。但是,除非进行一些缓存,否则看起来这可能会重新下载该文件,AllenNLPPredictor.from_path因此建议先将该文件手动下载到您自己的存储中,然后在PythonPredictor.__init__函数中从那里加载。

让我知道这是否需要澄清,或者我误解了。

于 2020-04-02T00:00:11.087 回答