之前已经写好了自己的Flask的app的代码:

提供了对外的REST接口。
现在需要把别人的NLP部分的代码:

合并进来,实现真正的AI的对话功能。
此处至少会涉及到:
导入的路径的配置和优化
如何调用对方的Class去实现真正的AI
其他一些可能的问题
先把代码放进来再说

然后再去一点点整合。
然后出错:
【已解决】gunicorn运行Flask的app出错:gunicorn.errors.HaltServer HaltServer Worker failed to boot 3
然后继续去测试接口,看看是否出错。
结果传入:

失败:

log:

结果找到
logs/gunicorn_error.log
中的原因:
<code> File "ai/nlp/dialog/intent.py", line 12, in __init__
self.parse(query)
File "ai/nlp/dialog/intent.py", line 37, in parse
config.readfp(open("config/config.ini"))
FileNotFoundError: [Errno 2] No such file or directory: 'config/config.ini'
</code>然后继续去修改代码
<code>config = configparser.ConfigParser()
# config.readfp(open("config/config.ini"))
configIniFilePath = os.path.join(self.projectRootPath, "ai/nlp/dialog/config/config.ini")
# print("configIniFilePath=%s" % (configIniFilePath))
configIniFp = open(configIniFilePath)
# print("configIniFp=%s" % (configIniFp))
</code>就可以了。
后续又遇到其他的类似的导入的问题。
继续去修改代码。
相关部分修改为:
ai/nlp/dialog/intent.py
<code>import os
class DialogInput(object):
def __init__(self, query, domain=None, slots=None, score=None):
self.dialogRootPath = os.path.join(os.getcwd(), "ai/nlp/dialog")
def parse(self, query):
config = configparser.ConfigParser()
# config.readfp(open("config/config.ini"))
configIniFilePath = os.path.join(self.dialogRootPath, "config/config.ini")
# print("configIniFilePath=%s" % (configIniFilePath))
configIniFp = open(configIniFilePath)
# print("configIniFp=%s" % (configIniFp))
config.readfp(configIniFp)
maxDomain = ""
maxSlots = ""
maxScore = 0
for domain in config["regexfile"]:
filepath = config.get("regexfile", domain)
# print(filepath)
# for line in open(filepath):
for line in open(os.path.join(self.dialogRootPath, filepath)):
</code>然后又出现其他错误:
至此,终于把NLP部分的代码,合并到当前Flaks的app了。
后面就是自己优化接口的事情了。
目前,改为:
<code>from flask import Flask
from flask import jsonify
from flask_restful import Resource, Api, reqparse
import logging
from logging.handlers import RotatingFileHandler
# from flask_pymongo import PyMongo
from gridfs import GridFS
from pymongo import MongoClient
from bson.objectid import ObjectId
from flask import send_file
import io
import re
import json
import sys
sys.path.append("ai")
...
sys.path.append("ai/util")
from DialogueManager import Context
from intent import DialogInput
from AccessData import AccessData
from GenerateResponse import GenerateResponse
################################################################################
# Global Function
################################################################################
# NLP AI related
def QueryAnalyse(query, context):
result = {'mediaId': None, 'response': None, 'control' : None}
semantic = DialogInput(query)
if semantic.domain == "control":
result['control'] = semantic.slots["command"]
mediaresult = AccessData(semantic,context)
if mediaresult and len(mediaresult) > 0:
result['mediaId'] = mediaresult[0][3]
result['response'] = GenerateResponse(mediaresult,semantic)
context.AddTurn(semantic, mediaresult)
return result
################################################################################
# Global Init App
################################################################################
app = Flask(__name__)
app.config.from_object('config.DevelopmentConfig')
# app.config.from_object('config.ProductionConfig')
logFormatterStr = app.config["LOG_FORMAT"]
logFormatter = logging.Formatter(logFormatterStr)
fileHandler = RotatingFileHandler(
app.config['LOG_FILE_FILENAME'],
maxBytes=app.config["LOF_FILE_MAX_BYTES"],
backupCount=app.config["LOF_FILE_BACKUP_COUNT"],
encoding="UTF-8")
fileHandler.setLevel(logging.DEBUG)
fileHandler.setFormatter(logFormatter)
app.logger.addHandler(fileHandler)
streamHandler = logging.StreamHandler()
streamHandler.setFormatter(logFormatter)
streamHandler.setLevel(logging.INFO)
app.logger.addHandler(streamHandler)
app.logger.setLevel(logging.DEBUG) # set root log level
log = app.logger
log.debug("app=%s", app)
log.info("app.config=%s", app.config)
api = Api(app)
log.info("api=%s", api)
aiContext = Context()
log.info("aiContext=%s", aiContext)
purePymongo = MongoClient(
host=app.config["MONGODB_HOST"],
port=app.config["MONGODB_PORT"],
username=app.config["MONGODB_USERNAME"],
password=app.config["MONGODB_PASSWORD"],
authSource=app.config["MONGODB_AUTH_SOURCE"]
)
log.info("purePymongo=%s", purePymongo)
# mongoServerInfo = purePymongo.server_info()
# log.debug("mongoServerInfo=%s", mongoServerInfo)
# Pure PyMongo
gridfsDb = purePymongo.gridfs
log.info("gridfsDb=%s", gridfsDb)
fsCollection = GridFS(gridfsDb)
log.info("fsCollection=%s", fsCollection)
class RobotQaAPI(Resource):
def get(self):
respDict = {
"code": 200,
"message": "generate response ok",
"data": {
"input": "",
"response": "",
"control": "",
"audio": {}
}
}
parser = reqparse.RequestParser()
# i want to hear the story of Baby Sister Says No
parser.add_argument('input', type=str, help="input words")
log.info("parser=%s", parser)
parsedArgs = parser.parse_args() #
log.info("parsedArgs=%s", parsedArgs)
if not parsedArgs:
respDict["data"]["response"] = "Can not recognize input"
return jsonify(respDict)
inputStr = parsedArgs["input"]
log.info("inputStr=%s", inputStr)
if not inputStr:
respDict["data"]["response"] = "Can not recognize parameter input"
return jsonify(respDict)
respDict["data"]["input"] = inputStr
aiResult = QueryAnalyse(inputStr, aiContext)
log.info("aiResult=%s", aiResult)
respDict["data"]["response"] = aiResult["response"]
respDict["data"]["control"] = aiResult["control"]
log.info('respDict["data"]=%s', respDict["data"])
audioFileIdStr = aiResult["mediaId"]
log.info("audioFileIdStr=%s", audioFileIdStr)
audioFileObjectId = ObjectId(audioFileIdStr)
log.info("audioFileObjectId=%s", audioFileObjectId)
# audioFileObj = fsCollection.find_one({"_id": audioFileObjectId})
# audioFileObj = fsCollection.find({"_id": audioFileObjectId})
# audioFileObj = fsCollection.find_one({"_id": audioFileIdStr})
# audioFileObj = fsCollection.get(audioFileObjectId)
# audioFileObj = fsCollection.get(audioFileIdStr)
# audioFileObj = fsCollection.find_one({"_id": audioFileIdStr})
# findFileCursor = fsCollection.find({"_id": audioFileObjectId})
# log.info("audioFileObj=%s", findFileCursor)
# for curIdx, eachFile in enumerate(findFileCursor):
# curNum = curIdx + 1
# log.info("[%2d] _id=%s, contentType=%s, filename=%s", curNum, eachFile._id, eachFile.contentType, eachFile.filename)
respDict["data"]["audio"] = {
"url": "http://%s:%d/files/%s/%s" %
(app.config["FILE_URL_HOST"],
app.config["FLASK_PORT"],
audioFileIdStr,
"fake_filename.mp3")
}
log.info("respDict=%s", respDict)
return jsonify(respDict)
# # if fsCollection.exists(audioFileObjectId):
# if fsCollection.exists(audioFileIdStr):
# # audioFileObj = fsCollection.get(audioFileObjectId)
# audioFileObj = fsCollection.get(audioFileIdStr)
# log.info("audioFileObj=%s", audioFileObj)
#
# respDict["data"]["audio"] = {
# "contentType": audioFileObj.contentType,
# "name": audioFileObj.filename,
# "size": audioFileObj.length,
# "url": "http://%s:%d/files/%s/%s" %
# (app.config["FILE_URL_HOST"],
# app.config["FLASK_PORT"],
# audioFileObj._id,
# audioFileObj.filename)
# }
# log.info("respDict=%s", respDict)
# return jsonify(respDict)
# else:
# log.warning("Can not find file from id %s", audioFileIdStr)
# respDict["data"]["audio"] = {}
# return jsonify(respDict)
api.add_resource(RobotQaAPI, '/qa', endpoint='qa')
if __name__ == "__main__":
app.run(
host=app.config["FLASK_HOST"],
port=app.config["FLASK_PORT"],
debug=app.config["DEBUG"]
)
</code>去返回响应。
其他的nlp的代码,就不贴了。
转载请注明:在路上 » 【已解决】把NLP部分的代码合并到当前Flask的app中