Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
174 lines
6.9 KiB
Python
174 lines
6.9 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Model Comparison Simulator
|
|
==========================
|
|
Simulates conversations with different Gemini models for comparison.
|
|
|
|
Usage:
|
|
python scripts/simulate_model_comparison.py
|
|
|
|
Author: Maciej Pienczyn, InPi sp. z o.o.
|
|
Created: 2026-01-29
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import json
|
|
from datetime import datetime
|
|
|
|
# Add parent directory to path for imports
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
|
|
from database import SessionLocal, AIChatConversation, AIChatMessage, User
|
|
from nordabiz_chat import NordaBizChatEngine
|
|
|
|
# Questions to compare (from Artur's and Maciej's conversations)
|
|
COMPARISON_QUESTIONS = {
|
|
'artur': {
|
|
'user_id': 3,
|
|
'user_name': 'Artur Wiertel',
|
|
'original_conversation_id': 63,
|
|
'questions': [
|
|
{
|
|
'id': 1,
|
|
'question': 'ilu członków ma izba norda?',
|
|
'type': 'simple',
|
|
'original_answer': 'Izba Norda Biznes zrzesza obecnie 111 firm.'
|
|
},
|
|
{
|
|
'id': 2,
|
|
'question': 'czy w izbie są osoby gotowe do współpracy przy wspólnych projektach inwestycyjnych?',
|
|
'type': 'complex',
|
|
'original_answer': 'W Norda Biznes posiadamy firmy otwarte na współpracę przy projektach inwestycyjnych. Szczególnie interesujące mogą być podmioty z kategorii Budownictwo, Nieruchomości oraz Usługi Biznesowe. Czy szukasz konkretnego rodzaju partnera lub projektu?'
|
|
},
|
|
{
|
|
'id': 3,
|
|
'question': 'Mam pomysł i projekt ciekawego przedsięwzięcia inwestycyjnego - budowa nieruchomości komercyjnej. Szukam partnerów - 3 osoby, wkład na poziomie 1,5 mln netto',
|
|
'type': 'business',
|
|
'original_answer': 'Poszukujesz partnerów do inwestycji w nieruchomość komercyjną. W naszej bazie znajdują się firmy, które mogą być zainteresowane takim przedsięwzięciem. Warto zwrócić uwagę na: ARD Invest, Progress Optima...'
|
|
},
|
|
{
|
|
'id': 4,
|
|
'question': 'a co sądzisz o firmie sigma?',
|
|
'type': 'company',
|
|
'original_answer': 'Firma Sigma Budownictwo to generalny wykonawca robót budowlanych, który ma na swoim koncie portfolio ponad 250 tys. m² powierzchni użytkowej, w tym hale przemysłowe. Jest to rodzinna firma z Wejherowa, zarządzana przez Romana i Tomasza Wiercińskich.'
|
|
},
|
|
{
|
|
'id': 5,
|
|
'question': 'co myślisz o pomysłach Jacka Pomieczyńskiego na forum?',
|
|
'type': 'analysis',
|
|
'original_answer': 'Chętnie pomogę! Aby odpowiedzieć na Twoje pytanie o pomysły Jacka Pomieczyńskiego, potrzebuję więcej informacji. Czy możesz sprecyzować, o jakie konkretnie pomysły chodzi?'
|
|
}
|
|
]
|
|
},
|
|
'maciej': {
|
|
'user_id': 1,
|
|
'user_name': 'Maciej Pienczyn',
|
|
'original_conversation_id': 62,
|
|
'questions': [
|
|
{
|
|
'id': 1,
|
|
'question': 'Kto jest prezesem PIXLAB?',
|
|
'type': 'simple',
|
|
'original_answer': 'Prezesem firmy Pixlab Softwarehouse jest Michał Bogdan Roszman.'
|
|
},
|
|
{
|
|
'id': 2,
|
|
'question': 'jakie znasz inne firmy IT w Norda?',
|
|
'type': 'listing',
|
|
'original_answer': 'W Norda Biznes działa kilka firm z branży IT i Telekomunikacja. Są to między innymi VENCODE, oferujące dedykowane aplikacje oparte na sztucznej inteligencji i technologii blockchain, oraz Delkom, specjalizujący się w usługach IT, cyberbezpieczeństwie i doradztwie informatycznym.'
|
|
},
|
|
{
|
|
'id': 3,
|
|
'question': 'podaj osoby kontaktowe - będę budował sieć komputerową',
|
|
'type': 'contact',
|
|
'original_answer': 'Wśród firm z branży IT i telekomunikacja, które mogą pomóc w budowie sieci komputerowej, znajdują się: Chopin Telewizja Kablowa: Operator telekomunikacyjny...'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
|
|
|
|
def run_simulation():
|
|
"""Run model comparison simulation."""
|
|
print("=" * 60)
|
|
print("MODEL COMPARISON SIMULATION")
|
|
print(f"New model: gemini-3-flash-preview")
|
|
print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
|
|
print("=" * 60)
|
|
|
|
# Initialize chat engine (uses new model from app config)
|
|
try:
|
|
chat_engine = NordaBizChatEngine()
|
|
print(f"✓ Chat engine initialized with model: {chat_engine.gemini_service.model_name}")
|
|
except Exception as e:
|
|
print(f"✗ Failed to initialize chat engine: {e}")
|
|
return None
|
|
|
|
results = {}
|
|
|
|
for user_key, user_data in COMPARISON_QUESTIONS.items():
|
|
print(f"\n--- {user_data['user_name']} ---")
|
|
results[user_key] = {
|
|
'user_id': user_data['user_id'],
|
|
'user_name': user_data['user_name'],
|
|
'original_conversation_id': user_data['original_conversation_id'],
|
|
'comparisons': []
|
|
}
|
|
|
|
for q in user_data['questions']:
|
|
print(f"\nQ{q['id']}: {q['question'][:50]}...")
|
|
|
|
try:
|
|
# Get response from new model
|
|
response = chat_engine.chat(
|
|
user_message=q['question'],
|
|
user_id=user_data['user_id'],
|
|
conversation_id=None, # New conversation context
|
|
save_to_db=False # Don't save simulation
|
|
)
|
|
|
|
new_answer = response.get('response', 'Brak odpowiedzi')
|
|
print(f" ✓ Got response ({len(new_answer)} chars)")
|
|
|
|
except Exception as e:
|
|
new_answer = f"Error: {str(e)}"
|
|
print(f" ✗ Error: {e}")
|
|
|
|
results[user_key]['comparisons'].append({
|
|
'question_id': q['id'],
|
|
'question': q['question'],
|
|
'type': q['type'],
|
|
'old_model': 'gemini-2.5-flash-lite',
|
|
'old_answer': q['original_answer'],
|
|
'new_model': 'gemini-3-flash-preview',
|
|
'new_answer': new_answer
|
|
})
|
|
|
|
# Save results to JSON
|
|
output_file = os.path.join(
|
|
os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
|
|
'data',
|
|
'model_comparison_results.json'
|
|
)
|
|
|
|
os.makedirs(os.path.dirname(output_file), exist_ok=True)
|
|
|
|
with open(output_file, 'w', encoding='utf-8') as f:
|
|
json.dump({
|
|
'generated_at': datetime.now().isoformat(),
|
|
'old_model': 'gemini-2.5-flash-lite',
|
|
'new_model': 'gemini-3-flash-preview',
|
|
'results': results
|
|
}, f, ensure_ascii=False, indent=2)
|
|
|
|
print(f"\n✓ Results saved to: {output_file}")
|
|
return results
|
|
|
|
|
|
if __name__ == '__main__':
|
|
run_simulation()
|