routes.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. # @description:
  2. # @author: licanglong
  3. # @date: 2025/11/20 14:22
  4. import uuid
  5. from typing import List
  6. from flask import request, jsonify
  7. from qdrant_client.models import VectorParams, Distance, PointStruct
  8. from app.blueprints.vector_store import vector_store_bp
  9. from app.client.VectorStoreClient import vector_store_client
  10. from app.constants.vector_store import VectorStoreCollection
  11. from app.models.Result import SysResult
  12. from app.models.dto import RiskRuleList, RiskDecisionCaseList, IndustryProfileList, RiskSignalList
  13. @vector_store_bp.route('/risk/rule', methods=['PUT'])
  14. def put_risk_rule():
  15. data = request.json or {}
  16. risk_rules = RiskRuleList(risk_rules=data).risk_rules
  17. collection_name = VectorStoreCollection.RULE_EMBED_STORE
  18. vector_store_client.create_collection(
  19. collection_name=collection_name,
  20. vectors_config=VectorParams(
  21. size=1792,
  22. distance=Distance.COSINE,
  23. ),
  24. )
  25. points: List[PointStruct] = []
  26. for item in risk_rules:
  27. vector = vector_store_client.embedding.encode(item.embedding_text)
  28. point_id = str(uuid.uuid4())
  29. item.rule_id = point_id
  30. points.append(
  31. PointStruct(
  32. id=point_id,
  33. vector=vector.tolist(),
  34. payload=item.dict(),
  35. )
  36. )
  37. vector_store_client.client.upsert(
  38. collection_name=collection_name,
  39. points=points,
  40. )
  41. return jsonify(SysResult.success())
  42. @vector_store_bp.route('/risk/case', methods=['PUT'])
  43. def put_case_rule():
  44. data = request.json or {}
  45. decision_cases = RiskDecisionCaseList(decision_cases=data).decision_cases
  46. collection_name = VectorStoreCollection.CASE_EMBED_STORE
  47. vector_store_client.create_collection(
  48. collection_name=collection_name,
  49. vectors_config=VectorParams(
  50. size=1792,
  51. distance=Distance.COSINE,
  52. ),
  53. )
  54. points: List[PointStruct] = []
  55. for item in decision_cases:
  56. vector = vector_store_client.embedding.encode(item.embedding_text)
  57. point_id = str(uuid.uuid4())
  58. item.case_id = point_id
  59. points.append(
  60. PointStruct(
  61. id=point_id,
  62. vector=vector.tolist(),
  63. payload=item.dict(),
  64. )
  65. )
  66. vector_store_client.client.upsert(
  67. collection_name=collection_name,
  68. points=points,
  69. )
  70. return jsonify(SysResult.success())
  71. @vector_store_bp.route('/risk/industry', methods=['PUT'])
  72. def put_industry_rule():
  73. data = request.json or {}
  74. industry_profiles = IndustryProfileList(industry_profiles=data).industry_profiles
  75. collection_name = VectorStoreCollection.MERCHANTS_EMBED_STORE
  76. vector_store_client.create_collection(
  77. collection_name=collection_name,
  78. vectors_config=VectorParams(
  79. size=1792,
  80. distance=Distance.COSINE,
  81. ),
  82. )
  83. points: List[PointStruct] = []
  84. for item in industry_profiles:
  85. vector = vector_store_client.embedding.encode(item.embedding_text)
  86. point_id = str(uuid.uuid4())
  87. item.merchant_industry_id = point_id
  88. points.append(
  89. PointStruct(
  90. id=point_id,
  91. vector=vector.tolist(),
  92. payload=item.dict(),
  93. )
  94. )
  95. vector_store_client.client.upsert(
  96. collection_name=collection_name,
  97. points=points,
  98. )
  99. return jsonify(SysResult.success())
  100. @vector_store_bp.route('/risk/signal', methods=['PUT'])
  101. def put_signal_rule():
  102. data = request.json or {}
  103. signals = RiskSignalList(signals=data).signals
  104. collection_name = VectorStoreCollection.RULE_EMBED_STORE
  105. vector_store_client.create_collection(
  106. collection_name=collection_name,
  107. vectors_config=VectorParams(
  108. size=1792,
  109. distance=Distance.COSINE,
  110. ),
  111. )
  112. points: List[PointStruct] = []
  113. for item in signals:
  114. vector = vector_store_client.embedding.encode(item.embedding_text)
  115. point_id = str(uuid.uuid4())
  116. item.signal_id = point_id
  117. points.append(
  118. PointStruct(
  119. id=point_id,
  120. vector=vector.tolist(),
  121. payload=item.dict(),
  122. )
  123. )
  124. vector_store_client.client.upsert(
  125. collection_name=collection_name,
  126. points=points,
  127. )
  128. return jsonify(SysResult.success())
  129. @vector_store_bp.route('/risk/rule', methods=['GET'])
  130. def get_risk_rule():
  131. data = request.json or {}
  132. vector = vector_store_client.embedding.encode(data.get('query', ""))
  133. query_response = vector_store_client.client.query_points(
  134. collection_name=VectorStoreCollection.RULE_EMBED_STORE,
  135. query=vector.tolist(),
  136. limit=5,
  137. score_threshold=0.5
  138. )
  139. rules = []
  140. for point in query_response.points:
  141. rules.append({
  142. "id": point.id,
  143. "score": point.score,
  144. "payload": point.payload,
  145. })
  146. return jsonify(SysResult.success(data=rules))