main.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """
  2. NLP microservice for labor arbitration element extraction.
  3. Serves the fine-tuned Chinese RoBERTa multi-task model.
  4. """
  5. from fastapi import FastAPI
  6. from app.schemas import ExtractRequest
  7. from app.services.extractor import ChineseLegalElementExtractor
  8. app = FastAPI(title="Labor NLP Service", version="0.2.0")
  9. # Initialize extractor (loads model on first use)
  10. _extractor: ChineseLegalElementExtractor | None = None
  11. _model_available: bool | None = None
  12. def get_extractor() -> ChineseLegalElementExtractor:
  13. global _extractor
  14. if _extractor is None:
  15. _extractor = ChineseLegalElementExtractor()
  16. return _extractor
  17. @app.get("/health")
  18. def health():
  19. global _model_available
  20. ext = get_extractor()
  21. if _model_available is None:
  22. _model_available = ext._use_model
  23. return {
  24. "status": "ok",
  25. "model_available": _model_available,
  26. "mode": "bert_multi_task" if _model_available else "rule_fallback",
  27. }
  28. @app.post("/extract")
  29. def extract_elements(payload: ExtractRequest):
  30. ext = get_extractor()
  31. result = ext.extract(payload.text)
  32. return result
  33. @app.post("/extract/compare")
  34. def extract_compare(payload: ExtractRequest):
  35. """Return extraction results with both model and rule-based methods."""
  36. ext = get_extractor()
  37. model_result = None
  38. rule_result = None
  39. # Try model extraction
  40. if ext._use_model:
  41. try:
  42. model_result = ext._extract_with_model(payload.text)
  43. except Exception:
  44. pass
  45. # Rule-based extraction
  46. rule_result = ext._extract_with_rules(payload.text)
  47. return {
  48. "model_result": model_result,
  49. "rule_result": rule_result,
  50. "model_available": ext._use_model,
  51. }