ZerOnyX / app.py
OniXinO
Пояснення змін:
3a8125e
import streamlit as st
import time
from transformers import pipeline, PipelineException
# --- Конфігурація ---
MODEL_NAME = "facebook/bart-large-mnli" # Ця модель добре працює для zero-shot
CONFIDENCE_THRESHOLD = 0.5 # Мінімальний рівень впевненості для визначення наміру
# --- Завантаження моделі ---
try:
# Використовуємо zero-shot classification для визначення наміру
intent_classifier = pipeline("zero-shot-classification", model=MODEL_NAME)
st.sidebar.success(f"Модель '{MODEL_NAME}' завантажена.")
except Exception as e:
st.error(f"Помилка завантаження моделі '{MODEL_NAME}': {e}")
st.warning("Застосунок не може працювати без моделі.")
# Зупиняємо виконання застосунку, якщо модель не завантажилась
st.stop()
# --- Словник стратегій ---
# Ключі - це потенційні наміри (мітки для zero-shot)
методи_для_намірів = {
"пошук інформації": {
"розбиття": lambda задача: [задача], # Для простоти, поки не розбиваємо
"метод": lambda підзадача: "Використовуйте пошукову систему (Google, DuckDuckGo)."
},
"написання тексту": {
"розбиття": lambda задача: [задача], # Для простоти, поки не розбиваємо
"метод": lambda підзадача: "Використовуйте текстовий редактор або онлайн-документ."
},
# Можна додати більше намірів тут
"переклад тексту": {
"розбиття": lambda задача: [задача],
"метод": lambda підзадача: "Використовуйте сервіс онлайн-перекладу (Google Translate, DeepL)."
}
}
# --- Функції ---
def визначити_намір(задача):
"""Визначає намір користувача за допомогою моделі zero-shot."""
наміри = list(методи_для_намірів.keys())
try:
# Класифікуємо задачу за списком можливих намірів
результат = intent_classifier(задача, candidate_labels=наміри)
print(f"Результат класифікації: {результат}") # Для налагодження
найкращий_намір = результат['labels'][0]
найвища_впевненість = результат['scores'][0]
# Перевіряємо, чи впевненість вища за поріг
if найвища_впевненість >= CONFIDENCE_THRESHOLD:
return найкращий_намір
else:
return "невизначено" # Якщо впевненість занизька
except PipelineException as e:
st.error(f"Помилка під час визначення наміру: {e}")
return "помилка класифікації"
except Exception as e:
st.error(f"Неочікувана помилка під час визначення наміру: {e}")
return "помилка класифікації"
def виконати_підзадачу(підзадача, метод):
"""Імітує виконання підзадачі."""
with st.spinner(f" Виконую підзадачу: '{підзадача}'..."):
st.write(f" *Метод:* {метод}")
time.sleep(1.5) # Імітація роботи
st.success(f" Підзадачу '{підзадача}' виконано!")
# --- Інтерфейс Streamlit ---
st.title("ZerOnyX: Простий агент для задач")
st.caption("Введіть задачу, і я спробую визначити, що робити.")
задача_користувача = st.text_input("Опишіть вашу задачу:", placeholder="Наприклад: 'знайди інформацію про квантові комп'ютери' або 'напиши короткий опис проєкту'")
if задача_користувача:
# Визначаємо намір
намір = визначити_намір(задача_користувача)
if намір != "помилка класифікації":
st.subheader(f"Визначений намір: {намір.capitalize()}")
if намір in методи_для_намірів:
стратегія = методи_для_намірів[намір]
підзадачі = стратегія["розбиття"](задача_користувача) # Зараз просто повертає початкову задачу
st.subheader("План виконання:")
if len(підзадачі) > 1:
st.write("Задача розбита на підзадачі:")
for i, підзадача in enumerate(підзадачі):
st.markdown(f"**Крок {i+1}:** {підзадача}")
метод = стратегія["метод"](підзадача)
виконати_підзадачу(підзадача, метод)
st.balloons() # Святкуємо успішне виконання :)
elif намір == "невизначено":
st.warning(f"Не вдалося достатньо впевнено визначити намір для задачі: '{задача_користувача}'. Спробуйте переформулювати.")
st.info(f"Я краще розумію задачі, пов'язані з: {', '.join(методи_для_намірів.keys())}.")
# else: # Цей випадок тепер обробляється через "невизначено" або "помилка класифікації"
# st.warning(f"Намір '{намір}' не вдалося обробити.")