File size: 6,354 Bytes
4836475
574da35
3a8125e
574da35
3a8125e
 
 
574da35
3a8125e
 
 
 
 
 
 
 
 
 
 
 
 
574da35
3a8125e
 
574da35
 
3a8125e
 
574da35
3a8125e
 
 
 
 
574da35
4e26107
7446058
3a8125e
574da35
3a8125e
4e9d877
3a8125e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4e26107
3a8125e
 
 
 
4e26107
99c2b57
3a8125e
 
 
99c2b57
3a8125e
99c2b57
 
3a8125e
574da35
3a8125e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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"Намір '{намір}' не вдалося обробити.")