test_support_highlight.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import copy
  2. import unittest
  3. from unittest.mock import Mock
  4. from src.step3_question_answer.support_highlight import support_highlight
  5. from src.step3_question_answer.recommendation import Recommender
  6. from test_recommendation import RECORD, candidate, good_analysis, handoff, retrieval
  7. def card(quote):
  8. return {'support_methods_standards': {'text': '不应当作原文的模型摘要',
  9. 'citations': [{'path': '/data/support', 'quote': quote}]}}
  10. class SupportHighlightTests(unittest.TestCase):
  11. def test_label_is_model_output_and_receives_original_quote(self):
  12. quote = '合成支持:最高80万元,每年发放。'
  13. refs = [{'path': '/data/support', 'quote': quote}]
  14. model = Mock(return_value={'text': '最高80万元/年', 'citations': refs})
  15. result = support_highlight(model, card(quote))
  16. self.assertEqual(result, {'text': '最高80万元/年', 'citations': refs, 'status': 'generated'})
  17. self.assertEqual(model.call_count, 1)
  18. self.assertEqual(model.call_args.args[1]['evidence'], refs)
  19. self.assertNotIn('不应当作原文', str(model.call_args))
  20. def test_invalid_or_failed_model_does_not_trigger_rule_amount_fallback(self):
  21. for value, error in (({}, 'highlight_invalid_schema'),
  22. ({'text': '最高99万元', 'citations': [{'path': '/wrong', 'quote': '最高99万元'}]}, 'highlight_invalid_citation'),
  23. ({'text': '最高99万元', 'citations': []}, 'highlight_invalid_citation')):
  24. result = support_highlight(Mock(return_value=value), card('最高99万元'))
  25. self.assertEqual(result['status'], 'fallback')
  26. self.assertEqual(result['text'], '扶持标准见详情')
  27. self.assertEqual(result['error'], error)
  28. self.assertEqual(support_highlight(Mock(side_effect=RuntimeError('SECRET')), card('最高99万元'))['error'], 'highlight_generation_failed')
  29. model = Mock()
  30. self.assertEqual(support_highlight(model, {})['status'], 'unavailable')
  31. model.assert_not_called()
  32. def test_selected_status_uses_llm_label_and_keeps_eligibility(self):
  33. record = copy.deepcopy(RECORD)
  34. record['data']['support'] = '提供培训服务。最高奖励20万元。'
  35. refs = [{'path': '/data/support', 'quote': record['data']['support']}]
  36. def model(instruction, payload):
  37. if payload.get('task') == 'policy_support_highlight':
  38. return {'text': '最高20万元', 'citations': refs}
  39. if 'cards' in payload:
  40. return {'text': '合成总结', 'source_ids': [record['id']]}
  41. value = good_analysis()
  42. value['card']['support_methods_standards'] = {'text': '培训支持', 'citations': refs}
  43. return value
  44. result = Recommender(model).answer(handoff(), retrieval([candidate(record)]))
  45. item = result['items'][0]
  46. self.assertEqual(item['recommendation_status'], '最高20万元')
  47. self.assertEqual(item['eligibility_status'], '相关线索,资格待核验')
  48. self.assertEqual(result['support_highlight_errors'], [])