File size: 2,576 Bytes
47efe2a cd35f10 d7232a0 cd35f10 d7232a0 cd35f10 d7232a0 cd35f10 d7232a0 cd35f10 52d0c85 d7232a0 cd35f10 d7232a0 cd35f10 d7232a0 cd35f10 52d0c85 cd35f10 52d0c85 cd35f10 52d0c85 cd35f10 52d0c85 cd35f10 d7232a0 52d0c85 cd35f10 52d0c85 cd35f10 |
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 |
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) |