VVI_team / src /streamlit_app.py
SuHoU's picture
Update src/streamlit_app.py
cd35f10 verified
import streamlit as st
from rag import rag_chain, retriever
# === Настройка страницы ===
st.set_page_config(
page_title="Поиск фильмов",
page_icon="🎬",
layout="centered"
)
# === Заголовок и подзаголовок ===
st.title("🎬 RAG-поиск по фильмам")
st.caption("Спросите что-нибудь о фильмах — я найду похожие и расскажу!")
# === Инициализация истории сообщений ===
if "messages" not in st.session_state:
st.session_state.messages = []
# === Отображение истории чата ===
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.write(msg["content"])
if "posters" in msg and msg["posters"]:
posters = [url.strip() for url in msg["posters"] if url.strip().startswith("http")]
cols = st.columns(min(5, len(posters)))
for i, url in enumerate(posters):
cols[i % len(cols)].image(url, width=130)
# === Обработка нового запроса ===
if prompt := st.chat_input("Например: «Порекомендуй фильм про космос»"):
# Добавляем сообщение пользователя
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.write(prompt)
# Получаем релевантные документы
with st.spinner("🔍 Ищу подходящие фильмы..."):
docs = retriever.invoke(prompt)
# Извлекаем постеры из метаданных
posters = [
doc.metadata.get("poster_url", "").strip()
for doc in docs
if doc.metadata.get("poster_url", "").strip().startswith("http")
]
# Генерируем ответ через RAG
with st.spinner("🧠 Формулирую ответ..."):
response = rag_chain.invoke(prompt)
# Сохраняем ответ ассистента с постерами
st.session_state.messages.append({
"role": "assistant",
"content": response,
"posters": posters
})
# Отображаем ответ
with st.chat_message("assistant"):
st.write(response)
if posters:
st.markdown("##### 🎞️ Найденные фильмы:")
cols = st.columns(min(5, len(posters)))
for i, url in enumerate(posters):
cols[i % len(cols)].image(url, width=130)