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)