knowledge_profiles.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. """Explicit knowledge destinations shared by preparation and offline import."""
  2. import re
  3. from pathlib import Path
  4. AGENTS = ('business', 'talent')
  5. def prepared_path(root, agent):
  6. if agent not in AGENTS:
  7. raise ValueError('unknown_knowledge_agent')
  8. return Path(root) / 'knowledge' / ('prepared' if agent == 'business' else 'prepared-talent')
  9. def for_agent(settings, agent, db_prefix=None):
  10. if agent not in AGENTS:
  11. raise ValueError('unknown_knowledge_agent')
  12. result = dict(settings)
  13. business = settings['MILVUS_DB_PREFIX']
  14. talent = settings.get('TALENT_MILVUS_DB_PREFIX', 'talent_knowledge')
  15. prefix = db_prefix if db_prefix is not None else business if agent == 'business' else talent
  16. if not isinstance(prefix, str) or not re.fullmatch(r'[A-Za-z][A-Za-z0-9_]{0,99}', prefix):
  17. raise ValueError('invalid_database_prefix')
  18. if business == talent or prefix == (talent if agent == 'business' else business):
  19. raise ValueError('knowledge_agent_prefix_collision')
  20. result.update(MILVUS_DB_PREFIX=prefix, KNOWLEDGE_AGENT=agent)
  21. return result
  22. def records_agent(records):
  23. agents = {record.get('knowledge_agent', 'business') for record in records}
  24. if len(agents) != 1 or not agents <= set(AGENTS):
  25. raise ValueError('mixed_or_unknown_knowledge_agents')
  26. return next(iter(agents))
  27. def check_records(records, settings):
  28. if records_agent(records) != settings.get('KNOWLEDGE_AGENT', 'business'):
  29. raise ValueError('knowledge_agent_mismatch')
  30. def talent_library(record):
  31. if record.get('knowledge_agent') != 'talent':
  32. return None
  33. libraries = {'人才政策和服务': 'article', '人才政策问答': 'qa', '青浦区惠企政策事项': 'policy'}
  34. try:
  35. return libraries[record['collection']]
  36. except KeyError:
  37. raise ValueError('unknown_talent_collection') from None