SuHoU commited on
Commit
cd35f10
·
verified ·
1 Parent(s): 214d594

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +39 -28
src/streamlit_app.py CHANGED
@@ -1,54 +1,65 @@
1
  import streamlit as st
2
- from rag import rag_chain, retriever # ← добавьте экспорт retriever из rag.py
3
 
4
- st.set_page_config(page_title="Поиск фильмов", layout="centered")
 
 
 
 
 
 
 
5
  st.title("🎬 RAG-поиск по фильмам")
6
  st.caption("Спросите что-нибудь о фильмах — я найду похожие и расскажу!")
7
 
 
8
  if "messages" not in st.session_state:
9
  st.session_state.messages = []
10
 
11
- # Отображение истории
12
  for msg in st.session_state.messages:
13
- st.chat_message(msg["role"]).write(msg["content"])
14
- if "posters" in msg:
15
- cols = st.columns(min(5, len(msg["posters"])))
16
- for i, url in enumerate(msg["posters"]):
17
- if url:
 
18
  cols[i % len(cols)].image(url, width=130)
19
 
20
- # Ввод пользователя
21
- if prompt := st.chat_input("Например: 'Порекомендуй фильм про космос'"):
 
22
  st.session_state.messages.append({"role": "user", "content": prompt})
23
- st.chat_message("user").write(prompt)
 
24
 
25
- # Получаем документы ДО генерации ответа (чтобы показать те же фильмы, что использовал LLM)
26
- docs = retriever.invoke(prompt)
 
27
 
28
- # Извлекаем poster_url из метаданных
29
  posters = [
30
- doc.metadata.get("poster_url", "")
31
  for doc in docs
32
- if doc.metadata.get("poster_url")
33
  ]
34
 
35
- # Генерация ответа
36
- with st.spinner("Ищу фильмы..."):
37
  response = rag_chain.invoke(prompt)
38
 
39
- # Сохраняем в историю с постерами
40
  st.session_state.messages.append({
41
  "role": "assistant",
42
  "content": response,
43
  "posters": posters
44
  })
45
 
46
- # Вывод ответа и постеров
47
- st.chat_message("assistant").write(response)
48
- if posters:
49
- st.write("##### 🎞️ Найденные фильмы:")
50
- cols = st.columns(min(5, len(posters)))
51
- for i, url in enumerate(posters):
52
- clean_url = url.strip() # ← КЛЮЧЕВОЙ МОМЕНТ
53
- if clean_url.startswith("http"):
54
- cols[i % len(cols)].image(clean_url, width=130)
 
1
  import streamlit as st
2
+ from rag import rag_chain, retriever
3
 
4
+ # === Настройка страницы ===
5
+ st.set_page_config(
6
+ page_title="Поиск фильмов",
7
+ page_icon="🎬",
8
+ layout="centered"
9
+ )
10
+
11
+ # === Заголовок и подзаголовок ===
12
  st.title("🎬 RAG-поиск по фильмам")
13
  st.caption("Спросите что-нибудь о фильмах — я найду похожие и расскажу!")
14
 
15
+ # === Инициализация истории сообщений ===
16
  if "messages" not in st.session_state:
17
  st.session_state.messages = []
18
 
19
+ # === Отображение истории чата ===
20
  for msg in st.session_state.messages:
21
+ with st.chat_message(msg["role"]):
22
+ st.write(msg["content"])
23
+ if "posters" in msg and msg["posters"]:
24
+ posters = [url.strip() for url in msg["posters"] if url.strip().startswith("http")]
25
+ cols = st.columns(min(5, len(posters)))
26
+ for i, url in enumerate(posters):
27
  cols[i % len(cols)].image(url, width=130)
28
 
29
+ # === Обработка нового запроса ===
30
+ if prompt := st.chat_input("Например: «Порекомендуй фильм про космос»"):
31
+ # Добавляем сообщение пользователя
32
  st.session_state.messages.append({"role": "user", "content": prompt})
33
+ with st.chat_message("user"):
34
+ st.write(prompt)
35
 
36
+ # Получаем релевантные документы
37
+ with st.spinner("🔍 Ищу подходящие фильмы..."):
38
+ docs = retriever.invoke(prompt)
39
 
40
+ # Извлекаем постеры из метаданных
41
  posters = [
42
+ doc.metadata.get("poster_url", "").strip()
43
  for doc in docs
44
+ if doc.metadata.get("poster_url", "").strip().startswith("http")
45
  ]
46
 
47
+ # Генерируем ответ через RAG
48
+ with st.spinner("🧠 Формулирую ответ..."):
49
  response = rag_chain.invoke(prompt)
50
 
51
+ # Сохраняем ответ ассистента с постерами
52
  st.session_state.messages.append({
53
  "role": "assistant",
54
  "content": response,
55
  "posters": posters
56
  })
57
 
58
+ # Отображаем ответ
59
+ with st.chat_message("assistant"):
60
+ st.write(response)
61
+ if posters:
62
+ st.markdown("##### 🎞️ Найденные фильмы:")
63
+ cols = st.columns(min(5, len(posters)))
64
+ for i, url in enumerate(posters):
65
+ cols[i % len(cols)].image(url, width=130)