File size: 6,388 Bytes
b573648
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a236cca
b573648
 
a236cca
b573648
 
a236cca
b573648
90ea049
3452e11
 
 
 
 
 
a236cca
b573648
 
 
 
 
 
 
 
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import os
import gradio as gr
from llama_index.llms.openrouter import OpenRouter
from llama_index.core.llms import ChatMessage
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings, StorageContext, load_index_from_storage

import nest_asyncio
nest_asyncio.apply()

# === Глобальная инициализация ===
embed_model = HuggingFaceEmbedding(model_name='intfloat/multilingual-e5-large-instruct')
Settings.embed_model = embed_model
Settings.llm = OpenRouter(
    api_key=os.environ["OPENROUTER_API_KEY"],
    model="qwen/qwen3-4b:free",
    max_tokens=10000,
    context_window=20000,
)
system_prompt = """
Ты — эксперт по адаптации к изменениям климата. 
У тебя есть база знаний с кейсами и нормативными документами.
Пользователь вводит запрос, связанный с климатическим риском в регионе или отрасли.

Твоя задача — на основе информации из базы знаний предложить 2–3 релевантных адаптационных мероприятия, 
которые помогут снизить климатический риск, о котором спрашивает пользователь.

### Требования к ответу:
1. Представь результат **в виде Markdown-таблицы** с колонками:
   - Наименование мероприятий  
   - Митигационный эффект  
   - Адаптационный эффект  
   - Актуальность для региона (указать с учётом контекста запроса). Если регион не указан, считай, что задается вопрос по Тюменской области
   - Ответственная организация (из региона)  

2. Если источник данных, на которых ты основываешь ответ, известен (это URL и краткое название кейса), 
   добавь их **ниже таблицы** в виде списка ссылок:  
   `**Опорные источники:** [1] Наименовавание мероприятий - URL, [2] Наименовавание мероприятий - URL`

3. Пиши кратко, по существу, с акцентом на реальные, практические меры.
4. Если информация отсутствует — предложи логичные адаптационные меры на основе Приказа Минэкономразвития России от 13 мая 2021 г. № 267 «Об утверждении методических рекомендаций и показателей по вопросам адаптации к изменениям климата».

Пример формата ответа:

| Наименование мероприятий | Митигационный эффект | Адаптационный эффект | Актуальность для Тобольского района | Ответственная организация |
|---------------------------|----------------------|----------------------|------------------------------------|----------------------------|
| Развитие городского электротранспорта | снижение эмиссии | повышение устойчивости транспортной инфраструктуры | актуально | городские власти |
| Перевод транспорта на газомоторное топливо | снижение эмиссии | рациональное использование ресурсов | реализуется частично | транспортные организации |

**Опорные источники:** [1] Наименовавание мероприятий - https://example.com/case_12
Приводи только те источники, которые используешь для формирования таблицы непосредственно. URL приводи строго такое же, как указано в базе знаний. Наименование мероприятий бери из базы знаний
Ответственную организацию в таблице указывай актуальную для региона, который пользователь указал в запросе
"""

# === Функция получения ответа ===
def get_facts(user_question: str) -> str:
    try:
        if not user_question.strip():
            return "Ошибка: пожалуйста, введите ваш запрос."

        storage_context = StorageContext.from_defaults(persist_dir="./storage")
        index = load_index_from_storage(storage_context)
        retriever = index.as_retriever(similarity_top_k=4)
        nodes = retriever.retrieve(user_question)

        context = "\n\n".join([node.get_content() for node in nodes]) if nodes else "Не найдено релевантных документов."
        full_system_prompt = system_prompt + f"\n\nКонтекст:\n{context}"

        messages = [
            ChatMessage(role="system", content=full_system_prompt),
            ChatMessage(role="user", content="Пользовательский запрос: " + user_question)
        ]
        
        response = Settings.llm.chat(messages)
        return response.message.content

    except Exception as e:
        return f"Ошибка:\n{str(e)}"
    
    response = Settings.llm.chat(messages)
    return response.message.content

with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("# Climate Risk Assessment System")

    user_input = gr.Textbox(
        label="Your query",
        lines=4,
        max_lines = 4,
        placeholder="Write your query"
    )
      
    answer_output = gr.Textbox(
        label="Response",
        lines=4,
        max_lines = 4,
    )
    
    send_button = gr.Button("Send query")
        
    send_button.click(
        fn=get_facts,
        inputs=user_input,
        outputs=answer_output
    )

demo.launch()