| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- import copy
- import unittest
- from unittest.mock import Mock
- from src.step3_question_answer.support_highlight import support_highlight
- from src.step3_question_answer.recommendation import Recommender
- from test_recommendation import RECORD, candidate, good_analysis, handoff, retrieval
- def card(quote):
- return {'support_methods_standards': {'text': '不应当作原文的模型摘要',
- 'citations': [{'path': '/data/support', 'quote': quote}]}}
- class SupportHighlightTests(unittest.TestCase):
- def test_label_is_model_output_and_receives_original_quote(self):
- quote = '合成支持:最高80万元,每年发放。'
- refs = [{'path': '/data/support', 'quote': quote}]
- model = Mock(return_value={'text': '最高80万元/年', 'citations': refs})
- result = support_highlight(model, card(quote))
- self.assertEqual(result, {'text': '最高80万元/年', 'citations': refs, 'status': 'generated'})
- self.assertEqual(model.call_count, 1)
- self.assertEqual(model.call_args.args[1]['evidence'], refs)
- self.assertNotIn('不应当作原文', str(model.call_args))
- def test_invalid_or_failed_model_does_not_trigger_rule_amount_fallback(self):
- for value, error in (({}, 'highlight_invalid_schema'),
- ({'text': '最高99万元', 'citations': [{'path': '/wrong', 'quote': '最高99万元'}]}, 'highlight_invalid_citation'),
- ({'text': '最高99万元', 'citations': []}, 'highlight_invalid_citation')):
- result = support_highlight(Mock(return_value=value), card('最高99万元'))
- self.assertEqual(result['status'], 'fallback')
- self.assertEqual(result['text'], '扶持标准见详情')
- self.assertEqual(result['error'], error)
- self.assertEqual(support_highlight(Mock(side_effect=RuntimeError('SECRET')), card('最高99万元'))['error'], 'highlight_generation_failed')
- model = Mock()
- self.assertEqual(support_highlight(model, {})['status'], 'unavailable')
- model.assert_not_called()
- def test_selected_status_uses_llm_label_and_keeps_eligibility(self):
- record = copy.deepcopy(RECORD)
- record['data']['support'] = '提供培训服务。最高奖励20万元。'
- refs = [{'path': '/data/support', 'quote': record['data']['support']}]
- def model(instruction, payload):
- if payload.get('task') == 'policy_support_highlight':
- return {'text': '最高20万元', 'citations': refs}
- if 'cards' in payload:
- return {'text': '合成总结', 'source_ids': [record['id']]}
- value = good_analysis()
- value['card']['support_methods_standards'] = {'text': '培训支持', 'citations': refs}
- return value
- result = Recommender(model).answer(handoff(), retrieval([candidate(record)]))
- item = result['items'][0]
- self.assertEqual(item['recommendation_status'], '最高20万元')
- self.assertEqual(item['eligibility_status'], '相关线索,资格待核验')
- self.assertEqual(result['support_highlight_errors'], [])
|