clovax-tax-chatbot / external_test.py
bissal's picture
Complete RAGโ†’LLMโ†’Web pipeline integration ๐Ÿค– Generated with Claude Code
4aa05c6
# 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()