routes.py 4.8 KB

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