|
|
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") |
|
|
] |
|
|
|
|
|
|
|
|
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) |