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"Намір '{намір}' не вдалося обробити.") |