ana-solo commited on
Commit
d36fbf5
·
verified ·
1 Parent(s): 13d8726

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +111 -0
main.py CHANGED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gdown
2
+ import os
3
+ import gradio as gr
4
+ import shutil
5
+ %pip install llama-index-llms-openrouter
6
+ %pip install llama-index llama-index-embeddings-huggingface nest-asyncio qdrant_client llama-index-embeddings-fastembed fastembed llama-index-vector-stores-faiss
7
+ %pip install faiss-cpu --no-cache
8
+ from llama_index.llms.openrouter import OpenRouter
9
+ from llama_index.core.llms import ChatMessage
10
+ from llama_index.readers.file import PDFReader
11
+ from llama_index.vector_stores.faiss import FaissVectorStore
12
+ from llama_index.core.ingestion import IngestionPipeline
13
+ from llama_index.embeddings.huggingface import HuggingFaceEmbedding
14
+ import faiss
15
+ from llama_index.core import Settings
16
+ from llama_index.core.readers import SimpleDirectoryReader
17
+ from llama_index.core import VectorStoreIndex
18
+
19
+ import nest_asyncio
20
+ nest_asyncio.apply()
21
+
22
+ def make_query_engine(file_path, embed_model_path, embed_dim):
23
+ # подготовка embedding-модели
24
+ EMBED_DIMENSION=embed_dim
25
+ embed_model = HuggingFaceEmbedding(model_name=embed_model_path)
26
+ Settings.embed_model = embed_model
27
+ # получение llama-3.3-8b по api
28
+ Settings.llm = OpenRouter(
29
+ api_key=os.environ["OPENROUTER_API_KEY"]
30
+ max_tokens=10000,
31
+ context_window=20000,
32
+ model="deepseek/deepseek-chat-v3.1:free",
33
+ )
34
+ file_path = file_path
35
+ # подготовка векторной базы данных
36
+ fais_index = faiss.IndexFlatL2(EMBED_DIMENSION)
37
+ vector_store = FaissVectorStore(faiss_index=fais_index)
38
+ # чтение документов в директории
39
+ reader = SimpleDirectoryReader(
40
+ input_dir=file_path,
41
+ )
42
+
43
+ docs = reader.load_data()
44
+ # конвейер для обработки и добавления документов в векторное хранилище
45
+ pipeline = IngestionPipeline(
46
+ vector_store=vector_store,
47
+ documents=docs
48
+ )
49
+
50
+ nodes = pipeline.run(show_progress=True)
51
+ # индекс хранилища векторов
52
+ vector_store_index = VectorStoreIndex(nodes)
53
+ # движок запросов
54
+ query_engine = vector_store_index.as_query_engine(similarity_top_k=4)
55
+ return query_engine
56
+
57
+ query_engine = make_query_engine('./data', 'intfloat/multilingual-e5-large-instruct', 1024)
58
+
59
+ syst_prompt = '''
60
+ Ты — экспертная система по разработке и рекомендациям адаптационных мероприятий для снижения климатических рисков. Твоя задача — на основании запроса пользователя и данных из базы знаний (нормативные акты, приказ Минэкономразвития, кейсы и пр.) предложить практичные, обоснованные и ранжированные рекомендации по адаптации. Если в базе знаний нет прямых аналогичных кейсов, ты должен всё равно предложить набор мер, опираясь на положения приказа Минэкономразвития и общепринятые подходы к адаптации. Действуй в рамках действующего законодательства и лучших практик.
61
+ Инструкции и правила:
62
+ Источники и уверенность
63
+ Явно указывай, какие документы/кейсы из базы знаний использованы (название документа или краткая цитата/парафраз релевантного положения) и уровень уверенности в применимости (высокая/средняя/низкая).
64
+ Если прямых кейсов нет, укажи: «Похожих кейсов в базе знаний не найдено — далее рекомендации основаны на приказе Минэкономразвития и общих принципах адаптации.»
65
+ Генерация рекомендаций
66
+ Формируй рекомендации как список мероприятий. Для каждого мероприятия дать:
67
+ Краткое название (1 строка).
68
+ Описание (2–4 предлож. — что и почему).
69
+ Оценка эффективности (высокая/средняя/низкая) и ожидаемый эффект (какие риски снижает и примерная величина снижения, если можно).
70
+ Приблизительная примерная стоимость и временные рамки внедрения (кратк/средн/долго).
71
+ Уровень приоритетности (см. пункт ранжирования ниже).
72
+ Возможные риски/ограничения при внедрении.
73
+ Рекомендации по метри��ам мониторинга (1–2 ключевые KPI), и источники данных для валидации.
74
+ Если есть похожие кейсы в базе — ссылка/референс на кейс и краткое сравнение.
75
+ Ранжирование
76
+ Всегда ранжируй предлагаемые мероприятия от наиболее важного/эффективного к наименее (приоритет 1 = самый важный). Учитывай комбинацию: эффективность, срочность, стоимость, простота внедрения и соответствие нормативам.
77
+ Поведение при отсутствии кейсов
78
+ Если не нашёл похожих кейсов по запросу, всё равно сгенерируйте минимум 2–3 практических мероприятий. Они должны:
79
+ быть напрямую увязаны с требованиями приказа Минэкономразвития;
80
+ опираться на общие технические и инженерные принципы адаптации;
81
+ включать как быстро реализуемые меры, так и средне- и долгосрочные решения.
82
+ Ясно укажи: «Нет прямых кейсов. Рекомендации основаны на: 1) приказ Минэкономразвития, 2) общих принципах адаптации и аналогичных практиках».
83
+ Формат выдачи
84
+ Выдавай результат в структурированном виде:
85
+ Проблема: переформулировка запроса.
86
+ Краткое резюме (2–4 предложения): главные рекомендации и их приоритет.
87
+ Список ранжированных мероприятий с указанными полями (см. пункт Генерация рекомендаций).
88
+ Раздел «Источники и ссылки»: перечислить использованные документы/кейсы с цитатами/парафразом и указанием, были ли они найдены в базе.
89
+ Язык и стиль
90
+ Пиши на русском языке, понятным профессиональным языком, избегая чрезмерной технической терминологии без объяснения.
91
+ Примеры формата ответа (короткий шаблон)
92
+ Начало:
93
+ Проблема: переформулировка запроса.
94
+ Резюме рекомендаций.
95
+ Ранжированный список мероприятий (каждое — с полями из п. Генерация рекомендаций).
96
+ Источники.
97
+
98
+ Если вопрос пользователя не связан с климатическими рисками и адаптационными мероприятиями, отвечай "Некорректный вопрос"
99
+ '''
100
+
101
+ def get_facts(question):
102
+ return query_engine.query(syst_prompt + question).response
103
+
104
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
105
+ gr.Markdown("# Информационная система формирования адаптационных мероприятий к климатическим рискам\nЗадайте вопрос, связанный с контекстом")
106
+ question_input = gr.Textbox(label='Запрос к системе', lines=2, placeholder="Введите свой запрос...")
107
+ answer_output = gr.Textbox(label="Ответ", interactive=False)
108
+ send_button = gr.Button("Отправить запрос")
109
+ send_button.click(get_facts, question_input, answer_output)
110
+
111
+ demo.launch()