lightrag.py 1.0 KB

12345678910111213141516171819202122232425262728293031
  1. from __future__ import annotations
  2. import re
  3. from app.core.knowledge.access import KnowledgeAccessContext
  4. from app.core.knowledge.retrieval.contracts import KnowledgeEvidence
  5. _SOURCE_PATTERN = re.compile(
  6. r"\[DATAOPS_SOURCE\s+([A-Za-z][A-Za-z0-9_]*:[^:\]\s]+:[0-9]+)\]"
  7. )
  8. class LightRAGRetriever:
  9. def __init__(self, client, *, canonical_loader) -> None:
  10. self._client = client
  11. self._canonical_loader = canonical_loader
  12. def retrieve(
  13. self, query: str, context: KnowledgeAccessContext, limit: int
  14. ) -> tuple[KnowledgeEvidence, ...]:
  15. raw_context = self._client.query_context(query, mode="mix", limit=limit)
  16. external_ids = tuple(dict.fromkeys(_SOURCE_PATTERN.findall(raw_context)))
  17. if not external_ids:
  18. return ()
  19. candidates = self._canonical_loader(external_ids, context, limit)
  20. return tuple(
  21. item
  22. for item in candidates
  23. if context.permits_domain(item.business_domain_uid)
  24. and item.freshness_status != "stale"
  25. )