Spaces:
Running
Running
File size: 8,107 Bytes
8571f1b | 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 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 | """
Приклад та тест використання GPT-5.3-chat-latest в проєкті Legal Position AI Analyzer
Параметри моделі:
- reasoning_effort: "low", "medium", "high"
- verbosity: "low", "medium", "high"
- store: False (не зберігати в історії OpenAI)
"""
import os
import sys
from openai import OpenAI
# Ініціалізація клієнта OpenAI
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
MODEL_NAME = "gpt-5.3-chat-latest"
def test_basic_connection():
"""Простий тест підключення до моделі."""
print(f"Тест підключення до {MODEL_NAME}...")
# NOTE: gpt-5.3-chat-latest supports only reasoning_effort="medium"
response = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "developer", "content": "Ти - правовий асистент."},
{"role": "user", "content": "Дай коротке визначення правової позиції суду (1-2 речення)."}
],
reasoning_effort="medium",
verbosity="medium",
store=False,
max_completion_tokens=256
)
content = response.choices[0].message.content
print(f"Відповідь: {content}")
print(f"Використано токенів: {response.usage.total_tokens}")
return content
def generate_legal_position(
court_decision_text: str,
reasoning_effort: str = "medium",
verbosity: str = "medium"
):
"""
Генерація правової позиції з використанням GPT-5.3-chat-latest
Args:
court_decision_text: Текст судового рішення
reasoning_effort: Рівень reasoning ("low", "medium", "high")
verbosity: Рівень деталізації відповіді ("low", "medium", "high")
Returns:
Згенерована правова позиція у форматі JSON
"""
system_prompt = """Ти - експерт-правознавець, який аналізує судові рішення
та формує правові позиції Верховного Суду України."""
user_prompt = f"""
Проаналізуй наступне судове рішення та сформуй правову позицію:
<court_decision>
{court_decision_text}
</court_decision>
Поверни результат у форматі JSON з полями:
- title: заголовок правової позиції
- text: текст правової позиції
- proceeding: тип судочинства
- category: категорія справи
"""
response = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "developer", "content": system_prompt},
{"role": "user", "content": user_prompt}
],
response_format={"type": "json_object"},
reasoning_effort=reasoning_effort,
verbosity=verbosity,
store=False,
max_completion_tokens=2048
)
return response.choices[0].message.content
def analyze_relevance(
legal_position: dict,
existing_positions: list,
reasoning_effort: str = "medium"
):
"""
Аналіз релевантності існуючих правових позицій з використанням GPT-5.3-chat-latest
Args:
legal_position: Згенерована правова позиція
existing_positions: Список існуючих правових позицій
reasoning_effort: Рівень reasoning ("low", "medium", "high")
Returns:
Аналіз релевантності у форматі JSON
"""
system_prompt = """Ти - експерт-аналітик правових позицій Верховного Суду України."""
positions_text = "\n\n".join([
f"[{i+1}] {pos['title']}: {pos['text']}"
for i, pos in enumerate(existing_positions)
])
user_prompt = f"""
Проаналізуй релевантність існуючих правових позицій до нової позиції:
Нова позиція:
{legal_position['title']}: {legal_position['text']}
Існуючі позиції:
{positions_text}
Поверни аналіз у форматі JSON з полями:
- relevant_positions: список релевантних позицій з обґрунтуванням
"""
response = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "developer", "content": system_prompt},
{"role": "user", "content": user_prompt}
],
response_format={"type": "json_object"},
reasoning_effort=reasoning_effort,
verbosity="medium",
store=False,
max_completion_tokens=4000
)
return response.choices[0].message.content
# Запуск тестів
if __name__ == "__main__":
import json
if not os.getenv("OPENAI_API_KEY"):
print("ПОМИЛКА: Змінна OPENAI_API_KEY не встановлена.")
sys.exit(1)
# Тест 1: базове підключення
print("=" * 60)
print(f"ТЕСТ: {MODEL_NAME}")
print("=" * 60)
try:
test_basic_connection()
print("ТЕСТ 1 (підключення): OK\n")
except Exception as e:
print(f"ТЕСТ 1 (підключення): ПОМИЛКА - {e}\n")
sys.exit(1)
# Тест 2: генерація правової позиції
test_decision = """
ПОСТАНОВА ІМЕНЕМ УКРАЇНИ
Верховний Суд у складі колегії суддів Касаційного цивільного суду
розглянув у порядку письмового провадження справу за позовом фізичної особи
до банку про захист прав споживача.
Суд встановив, що банк нараховував комісію за обслуговування кредиту,
яка не була передбачена кредитним договором, що є порушенням прав споживача
відповідно до Закону України "Про захист прав споживачів".
"""
# NOTE: gpt-5.3-chat-latest підтримує лише reasoning_effort="medium"
print("Тест 2: Генерація правової позиції (reasoning_effort=medium)...")
try:
result = generate_legal_position(
court_decision_text=test_decision,
reasoning_effort="medium",
verbosity="medium"
)
parsed = json.loads(result)
print(f"Title: {parsed.get('title', 'N/A')}")
print(f"Category: {parsed.get('category', 'N/A')}")
print("ТЕСТ 2 (генерація): OK\n")
except Exception as e:
print(f"ТЕСТ 2 (генерація): ПОМИЛКА - {e}\n")
sys.exit(1)
# Тест 3: аналіз релевантності
print("Тест 3: Аналіз релевантності...")
existing = [
{
"title": "Про нарахування незаконних комісій банком",
"text": "Банк не має права нараховувати комісії, не передбачені договором."
}
]
try:
analysis = analyze_relevance(
legal_position=parsed,
existing_positions=existing,
reasoning_effort="medium"
)
print(f"Аналіз: {analysis[:200]}...")
print("ТЕСТ 3 (аналіз): OK\n")
except Exception as e:
print(f"ТЕСТ 3 (аналіз): ПОМИЛКА - {e}\n")
sys.exit(1)
print("=" * 60)
print("Всі тести пройшли успішно!")
|