web.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Time : 2024/9/10 18:33
  5. @Author : cao
  6. @File : web.py.py
  7. @Desc :
  8. """
  9. import json
  10. import uvicorn
  11. from fastapi import FastAPI
  12. from pydantic import BaseModel
  13. from sentence_transformers import SentenceTransformer
  14. import utils
  15. import faiss
  16. from collections import Counter
  17. import logging
  18. from starlette.responses import JSONResponse
  19. import dirty
  20. from prometheus_fastapi_instrumentator import Instrumentator, metrics
  21. logger = logging.getLogger('my_logger')
  22. logger.setLevel(logging.INFO)
  23. console_handler = logging.StreamHandler()
  24. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  25. logger.addHandler(console_handler)
  26. model = utils.load_model()
  27. index = utils.index
  28. cate = utils.cate
  29. class Sentence(BaseModel):
  30. query: str
  31. sessionId: str
  32. app = FastAPI()
  33. Instrumentator().instrument(app).expose(app)
  34. @app.post('/intention')
  35. def intention(sentence:Sentence):
  36. query, session_id = sentence.query, sentence.sessionId
  37. logger.info(f"intention: session_id:{session_id}, query:{query}")
  38. if query is None or len(query)==0:
  39. return JSONResponse(content={"status":0, "intention": "others", "query": query, "isFaq":False}, media_type="application/json")
  40. is_dirty, mess = dirty.dirty_detect(query)
  41. if is_dirty:
  42. return JSONResponse(content=mess, media_type="application/json")
  43. embed = model.encode([query], normalize_embeddings=True)
  44. D, I = index.search(embed, 3)
  45. index_prob = dict(zip(I[0], D[0]))
  46. out = []
  47. for doc_id, prob in index_prob.items():
  48. ans = cate.get(str(doc_id), {})
  49. ans['prob'] = prob
  50. ans['doc_id'] = doc_id
  51. out.append(ans)
  52. out = sorted(out, key=lambda x: float(x['prob']), reverse=True)
  53. res = {}
  54. intention = [i for i in map(lambda x: x['意图类别'], out)]
  55. first= out[0]['prob']
  56. logger.info(f"intention: session_id:{session_id}, query:{query}, first scores:{first}")
  57. if out[0]['prob'] >0.9 or (out[0]['prob'] >0.7 and (len(set(intention)) ==1 or len(intention)== len(set(intention)))):
  58. res['ans'] = out[0]['FAQ答案']
  59. res['doc_id'] = int(out[0]['doc_id'])
  60. res['score'] = float(out[0]['prob'])
  61. res['intent'] = out[0]['cate']
  62. res['class'] = out[0]['class']
  63. res['subclass'] = out[0]['意图类别']
  64. res['isFaq'] = False if out[0]['cate'] !="FAQ" else True
  65. res['recall'] = "emb"
  66. res['query'] = query
  67. res['status'] = 2
  68. res['intent'] = out[0]['cate']
  69. else:
  70. intention_cate = dict(Counter(intention))
  71. intention_max = sorted(intention_cate.items(), key=lambda x: x[1], reverse=True)[0]
  72. out = [i for i in filter(lambda x: x['意图类别']==intention_max[0], out)]
  73. res['ans'] = out[0]['FAQ答案']
  74. res['doc_id'] = int(out[0]['doc_id'])
  75. res['score'] = float(out[0]['prob'])
  76. res['isFaq'] = False if out[0]['cate'] !="FAQ" else True
  77. res['recall'] = "emb"
  78. res['class'] = out[0]['class']
  79. res['subclass'] = out[0]['意图类别']
  80. res['query'] = query
  81. if out[0]['prob'] < 0.7:
  82. res['intent'] = 'others'
  83. res['status'] = 4
  84. else:
  85. res['intent'] = out[0]['cate']
  86. res['status'] = 3
  87. logger.info(f"intention: session_id:{session_id}: ans:{res}")
  88. return JSONResponse(content=res, media_type="application/json")
  89. if __name__ == '__main__':
  90. uvicorn.run("web:app", host='0.0.0.0', port=50072, workers=4)