Spaces:
Sleeping
Sleeping
Update main.py
Browse files
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()
|