ana-solo commited on
Commit
8428681
·
verified ·
1 Parent(s): b79dbf3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -65
app.py CHANGED
@@ -4,14 +4,13 @@ from llama_index.llms.openrouter import OpenRouter
4
  from llama_index.core.llms import ChatMessage
5
  from llama_index.embeddings.huggingface import HuggingFaceEmbedding
6
  from llama_index.core import Settings, StorageContext, load_index_from_storage
7
- import markdown
8
  import nest_asyncio
9
  nest_asyncio.apply()
10
 
11
- # === 🔧 Глобальная инициализация ===
12
  embed_model = HuggingFaceEmbedding(model_name='intfloat/multilingual-e5-large-instruct')
13
  Settings.embed_model = embed_model
14
-
15
  Settings.llm = OpenRouter(
16
  api_key=os.environ["OPENROUTER_API_KEY"],
17
  model="qwen/qwen3-4b:free",
@@ -19,88 +18,57 @@ Settings.llm = OpenRouter(
19
  context_window=20000,
20
  )
21
 
22
- # === 🧠 Системный промпт ===
23
- SYSTEM_PROMPT = """
24
- Ты — эксперт по адаптации к изменениям климата.
25
- У тебя есть база знаний с кейсами и нормативными документами.
26
- Пользователь вводит запрос, связанный с климатическим риском в регионе или отрасли.
27
- Твоя задача — на основе информации из базы знаний предложить 1–3 релевантных адаптационных мероприятия,
28
- которые помогут снизить климатический риск, о котором спрашивает пользователь. Из базы знаний выбирай только те мероприятия, которые наиболее применимы в случае, описанном пользователем.
29
-
30
- ### Требования к ответу:
31
- 1. Представь результат **в виде Markdown-таблицы** с колонками:
32
- - Наименование мероприятий
33
- - Митигационный эффект
34
- - Адаптационный эффект
35
- - Актуальность для региона (указать с учётом контекста запроса). Если регион не указан, считай, что задается вопрос по Тюменской области
36
- - Ответственная организация (из региона)
37
- 2. Если источник данных, на которых ты основываешь ответ, известен (это URL и краткое название кейса),
38
- добавь их **ниже таблицы** в виде списка ссылок:
39
- `**Опорные источники:** [1] Название кейса - URL, [2] Название кейса - URL`
40
- 3. Пиши кратко, по существу, с акцентом на реальные, практические меры.
41
- 4. Если информация отсутствует — предложи логичные адаптационные меры на основе Приказа Минэкономразвития России от 13 мая 2021 г. № 267
42
- «Об утверждении методических рекомендаций и показателей по вопросам адаптации к изменениям климата».
43
-
44
- Пример формата ответа:
45
- | Наименование мероприятий | Митигационный эффект | Адаптационный эффект | Актуальность для Тобольского района | Ответственная организация |
46
- |---------------------------|----------------------|----------------------|------------------------------------|----------------------------|
47
- | Развитие городского электротранспорта | снижение эмиссии | повышение устойчивости транспортной инфраструктуры | актуально | городские власти |
48
- | Перевод транспорта на газомоторное топливо | снижение эмиссии | рациональное использование ресурсов | реализуется частично | транспортные организации |
49
- **Опорные источники:** [1] Кейс 12 - <https://example.com/case_12>
50
- """
51
-
52
- # === 🧩 Функция получения ответа ===
53
- def get_facts(user_question: str) -> str:
54
  try:
55
  if not user_question.strip():
56
- return "Пожалуйста, введите ваш запрос."
57
 
58
- # Загружаем индекс
59
  storage_context = StorageContext.from_defaults(persist_dir="./storage")
60
  index = load_index_from_storage(storage_context)
61
  retriever = index.as_retriever(similarity_top_k=4)
62
  nodes = retriever.retrieve(user_question)
63
 
64
- # Формируем контекст
65
  context = "\n\n".join([node.get_content() for node in nodes]) if nodes else "Не найдено релевантных документов."
66
- full_prompt = SYSTEM_PROMPT + f"\n\nБаза знаний:\n{context}"
67
 
68
- # Отправляем сообщение модели
69
  messages = [
70
- ChatMessage(role="system", content=full_prompt),
71
- ChatMessage(role="user", content="Пользовательский вопрос: " + user_question)
72
  ]
 
73
  response = Settings.llm.chat(messages)
74
-
75
- # Преобразуем markdown в HTML для красивого вывода таблицы
76
- html = markdown.markdown(response.message.content, extensions=["tables", "fenced_code", "nl2br"])
77
- return html
78
 
79
  except Exception as e:
80
  return f"Ошибка:\n{str(e)}"
 
 
 
81
 
82
-
83
- # === 🎨 Интерфейс Gradio ===
84
- with gr.Blocks(theme=gr.themes.Soft(), css="""
85
- .output-box {
86
- min-height: 400px;
87
- overflow-y: auto;
88
- border: 1px solid #ccc;
89
- border-radius: 10px;
90
- padding: 10px;
91
- }
92
- """) as demo:
93
  gr.Markdown("# Информационная система для помощи в адаптации к климатическим рискам")
94
-
 
 
 
 
 
 
95
  user_input = gr.Textbox(
96
  label="Ваш запрос",
97
  lines=4,
98
- placeholder="Например: 'В Тюменской области риск паводка'"
 
 
 
 
 
 
 
 
 
 
99
  )
100
 
101
- answer_output = gr.HTML(label="Рекомендованные адаптационные мероприятия", elem_classes="output-box")
102
-
103
- send_button = gr.Button("Получить рекомендации")
104
- send_button.click(fn=get_facts, inputs=user_input, outputs=answer_output)
105
-
106
- demo.launch()
 
4
  from llama_index.core.llms import ChatMessage
5
  from llama_index.embeddings.huggingface import HuggingFaceEmbedding
6
  from llama_index.core import Settings, StorageContext, load_index_from_storage
7
+
8
  import nest_asyncio
9
  nest_asyncio.apply()
10
 
11
+ # === Глобальная инициализация ===
12
  embed_model = HuggingFaceEmbedding(model_name='intfloat/multilingual-e5-large-instruct')
13
  Settings.embed_model = embed_model
 
14
  Settings.llm = OpenRouter(
15
  api_key=os.environ["OPENROUTER_API_KEY"],
16
  model="qwen/qwen3-4b:free",
 
18
  context_window=20000,
19
  )
20
 
21
+ # === Функция получения ответа ===
22
+ def get_facts(system_prompt: str, user_question: str) -> str:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  try:
24
  if not user_question.strip():
25
+ return "Ошибка: пожалуйста, введите ваш запрос."
26
 
 
27
  storage_context = StorageContext.from_defaults(persist_dir="./storage")
28
  index = load_index_from_storage(storage_context)
29
  retriever = index.as_retriever(similarity_top_k=4)
30
  nodes = retriever.retrieve(user_question)
31
 
 
32
  context = "\n\n".join([node.get_content() for node in nodes]) if nodes else "Не найдено релевантных документов."
33
+ full_system_prompt = system_prompt + f"\n\nКонтекст:\n{context}"
34
 
 
35
  messages = [
36
+ ChatMessage(role="system", content=full_system_prompt),
37
+ ChatMessage(role="user", content="Пользовательский запрос: " + user_question)
38
  ]
39
+
40
  response = Settings.llm.chat(messages)
41
+ return response.message.content
 
 
 
42
 
43
  except Exception as e:
44
  return f"Ошибка:\n{str(e)}"
45
+
46
+ response = Settings.llm.chat(messages)
47
+ return response.message.content
48
 
49
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
 
 
 
 
 
 
 
 
 
 
50
  gr.Markdown("# Информационная система для помощи в адаптации к климатическим рискам")
51
+ system_input = gr.Textbox(
52
+ label="Системный промпт",
53
+ lines=5,
54
+ max_lines = 5,
55
+ placeholder="Введите системный промпт"
56
+ )
57
+
58
  user_input = gr.Textbox(
59
  label="Ваш запрос",
60
  lines=4,
61
+ max_lines = 4,
62
+ placeholder="Введите свой запрос"
63
+ )
64
+
65
+ answer_output = gr.Textbox(label="Ответ", lines=8, interactive=False)
66
+ send_button = gr.Button("Получить ответ")
67
+
68
+ send_button.click(
69
+ fn=get_facts,
70
+ inputs=[system_input, user_input],
71
+ outputs=answer_output
72
  )
73
 
74
+ demo.launch()