File size: 6,375 Bytes
4aa05c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# external_test.py - μ™ΈλΆ€μ—μ„œ ν—ˆκΉ…νŽ˜μ΄μŠ€ 슀페이슀 API ν…ŒμŠ€νŠΈ
"""
ν—ˆκΉ…νŽ˜μ΄μŠ€ μŠ€νŽ˜μ΄μŠ€κ°€ 배포된 ν›„ μ™ΈλΆ€μ—μ„œ APIλ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” μ½”λ“œ
"""

import requests
import time
import json

class HuggingFaceSpaceTest:
    """ν—ˆκΉ…νŽ˜μ΄μŠ€ 슀페이슀 API ν…ŒμŠ€νŠΈ 클래슀"""
    
    def __init__(self, space_url):
        """
        space_url: ν—ˆκΉ…νŽ˜μ΄μŠ€ 슀페이슀 URL
        예: https://bissal-clovax-tax-chatbot.hf.space
        """
        self.space_url = space_url.rstrip('/')
        self.session = requests.Session()
        
    def test_space_status(self):
        """슀페이슀 μƒνƒœ 확인"""
        print("🌐 슀페이슀 μƒνƒœ 확인 쀑...")
        try:
            response = self.session.get(f"{self.space_url}/", timeout=10)
            if response.status_code == 200:
                print(f"βœ… 슀페이슀 정상 μ ‘κ·Ό κ°€λŠ₯: {response.status_code}")
                return True
            else:
                print(f"⚠️ 슀페이슀 μƒνƒœ 이상: {response.status_code}")
                return False
        except requests.RequestException as e:
            print(f"❌ 슀페이슀 μ ‘κ·Ό μ‹€νŒ¨: {e}")
            return False
    
    def test_gradio_api(self, test_query="μ·¨λ“μ„Έμœ¨μ΄ μ–Όλ§ˆμΈκ°€μš”?"):
        """Gradio API ν…ŒμŠ€νŠΈ"""
        print(f"πŸ€– API ν…ŒμŠ€νŠΈ: '{test_query}'")
        
        try:
            # Gradio API μ—”λ“œν¬μΈνŠΈ
            api_url = f"{self.space_url}/api/predict"
            
            payload = {
                "data": [test_query, []],  # [message, chat_history]
                "fn_index": 0  # chat ν•¨μˆ˜μ˜ 인덱슀
            }
            
            start_time = time.time()
            response = self.session.post(
                api_url,
                json=payload,
                timeout=30
            )
            response_time = time.time() - start_time
            
            if response.status_code == 200:
                result = response.json()
                print(f"βœ… API 응닡 성곡: {response_time:.2f}초")
                
                if 'data' in result:
                    bot_response = result['data'][1][-1][1]  # λ§ˆμ§€λ§‰ 봇 응닡
                    print(f"πŸ“ 응닡 λ‚΄μš© (처음 100자): {bot_response[:100]}...")
                    return {
                        'success': True,
                        'response_time': response_time,
                        'response': bot_response
                    }
                else:
                    print("⚠️ μ˜ˆμƒκ³Ό λ‹€λ₯Έ 응닡 ν˜•μ‹")
                    return {'success': False, 'error': 'Invalid response format'}
            else:
                print(f"❌ API 호좜 μ‹€νŒ¨: {response.status_code}")
                return {'success': False, 'error': f'HTTP {response.status_code}'}
                
        except requests.RequestException as e:
            print(f"❌ API ν…ŒμŠ€νŠΈ μ‹€νŒ¨: {e}")
            return {'success': False, 'error': str(e)}
    
    def test_multiple_queries(self):
        """μ—¬λŸ¬ 쿼리 μ„±λŠ₯ ν…ŒμŠ€νŠΈ"""
        test_queries = [
            "μ·¨λ“μ„Έμœ¨μ΄ μ–Όλ§ˆμΈκ°€μš”?",
            "1μ„ΈλŒ€ 1μ£Όνƒμž 감면 ν˜œνƒμ€?",
            "μ‹ ν˜ΌλΆ€λΆ€ 취득세 νŠΉλ‘€λŠ”?",
            "농지 취득세 계산방법은?",
            "λ‹€μ£Όνƒμž μ€‘κ³Όμ„Έμœ¨μ€?"
        ]
        
        print(f"πŸ”„ 닀쀑 쿼리 ν…ŒμŠ€νŠΈ: {len(test_queries)}개")
        
        results = []
        total_time = 0
        
        for i, query in enumerate(test_queries, 1):
            print(f"\nπŸ“ ν…ŒμŠ€νŠΈ {i}/{len(test_queries)}: {query}")
            
            result = self.test_gradio_api(query)
            results.append(result)
            
            if result['success']:
                total_time += result['response_time']
                print(f"⏱️ μ‘λ‹΅μ‹œκ°„: {result['response_time']:.2f}초")
            else:
                print(f"❌ μ‹€νŒ¨: {result['error']}")
            
            # API λΆ€ν•˜ λ°©μ§€λ₯Ό μœ„ν•œ λ”œλ ˆμ΄
            time.sleep(1)
        
        # μ„±λŠ₯ μš”μ•½
        successful_queries = [r for r in results if r['success']]
        success_rate = len(successful_queries) / len(test_queries) * 100
        avg_response_time = total_time / len(successful_queries) if successful_queries else 0
        
        print(f"\nπŸ“Š μ„±λŠ₯ μš”μ•½:")
        print(f"  성곡λ₯ : {success_rate:.1f}% ({len(successful_queries)}/{len(test_queries)})")
        print(f"  평균 μ‘λ‹΅μ‹œκ°„: {avg_response_time:.2f}초")
        print(f"  총 ν…ŒμŠ€νŠΈ μ‹œκ°„: {total_time:.2f}초")
        
        return {
            'success_rate': success_rate,
            'avg_response_time': avg_response_time,
            'total_time': total_time,
            'results': results
        }
    
    def run_full_test(self):
        """전체 ν…ŒμŠ€νŠΈ μ‹€ν–‰"""
        print("πŸ§ͺ ν—ˆκΉ…νŽ˜μ΄μŠ€ 슀페이슀 전체 ν…ŒμŠ€νŠΈ μ‹œμž‘")
        print("=" * 60)
        
        # 1. 슀페이슀 μƒνƒœ 확인
        if not self.test_space_status():
            print("❌ 슀페이슀 μ ‘κ·Ό λΆˆκ°€λ‘œ ν…ŒμŠ€νŠΈ 쀑단")
            return False
        
        print()
        
        # 2. API κΈ°λ³Έ ν…ŒμŠ€νŠΈ
        basic_result = self.test_gradio_api()
        if not basic_result['success']:
            print("❌ κΈ°λ³Έ API ν…ŒμŠ€νŠΈ μ‹€νŒ¨λ‘œ ν…ŒμŠ€νŠΈ 쀑단")
            return False
        
        # 3. 닀쀑 쿼리 μ„±λŠ₯ ν…ŒμŠ€νŠΈ
        performance_result = self.test_multiple_queries()
        
        print("\n" + "=" * 60)
        print("πŸŽ‰ 전체 ν…ŒμŠ€νŠΈ μ™„λ£Œ!")
        
        if performance_result['success_rate'] >= 80:
            print("βœ… μ‹œμŠ€ν…œ 정상 μž‘λ™")
        else:
            print("⚠️ μ‹œμŠ€ν…œ μ„±λŠ₯ μ €ν•˜ 감지")
        
        return True

def main():
    """메인 ν…ŒμŠ€νŠΈ μ‹€ν–‰"""
    import sys
    
    if len(sys.argv) > 1:
        space_url = sys.argv[1]
    else:
        # κΈ°λ³Έ URL (μ‹€μ œ 배포된 슀페이슀 URL둜 λ³€κ²½)
        space_url = "https://bissal-clovax-tax-chatbot.hf.space"
        print(f"κΈ°λ³Έ URL μ‚¬μš©: {space_url}")
        print("λ‹€λ₯Έ URL μ‚¬μš©μ‹œ: python external_test.py <SPACE_URL>")
    
    tester = HuggingFaceSpaceTest(space_url)
    tester.run_full_test()

if __name__ == "__main__":
    main()