|
import streamlit as st |
|
import time |
|
from transformers import pipeline, PipelineException |
|
|
|
|
|
MODEL_NAME = "facebook/bart-large-mnli" |
|
CONFIDENCE_THRESHOLD = 0.5 |
|
|
|
|
|
try: |
|
|
|
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() |
|
|
|
|
|
|
|
методи_для_намірів = { |
|
"пошук інформації": { |
|
"розбиття": 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" Підзадачу '{підзадача}' виконано!") |
|
|
|
|
|
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())}.") |
|
|
|
|