File size: 10,503 Bytes
13d0427
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fa02ae1
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import os

# EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
EMBEDDING_MODEL = "intfloat/multilingual-e5-small"

# RERANKING_MODEL = "cross-encoder/ms-marco-MiniLM-L-12-v2" # Muslimbeck's choice
# RERANKING_MODEL = "cointegrated/rubert-tiny-stsb-cross-encoder" # Russian language, GOSTS, Lower RAM usage
RERANKING_MODEL = "DiTy/cross-encoder-russian-msmarco" # Russian language, GOSTS, Higher RAM usage
# RERANKING_MODEL = "cross-encoder/mmarco-mMiniLM-v2-L12-H384-v1" #Multi language, WEB, Lower RAM usage

CHUNK_SIZE = 1000
CHUNK_OVERLAP = 50

MAX_CHARS_TABLE = CHUNK_SIZE * 1.4
MAX_ROWS_TABLE = 15

DEFAULT_RETRIEVAL_PARAMS = {
    'vector_top_k': 60,         # Количество кандидатов от векторного поиска
    'bm25_top_k': 60,           # Количество кандидатов от поиска по ключевым словам
    'similarity_cutoff': 0.6,  # Минимальный порог схожести для векторного поиска
    'hybrid_top_k': 120,        # Сколько кандидатов берем после слияния (Fusion)
    'rerank_top_k': 20,          # Сколько финальных чанков отдаем в LLM после переранжирования
    'rerank_threshold': 0.4      # Порог схожести для переранжирования
}

RAG_FILES_DIR = "rag_files"
INDEX_STORAGE_DIR = "rag_files/storage_index"
PROCESSED_DATA_FILE = "processed_chunks.csv"

REPO_ID = "RAG-AIEXP/ragfiles"
faiss_index_filename = "cleaned_faiss_index.index"
CHUNKS_FILENAME = "processed_chunks.csv"
TABLE_DATA_DIR = "Табличные данные_JSON"
IMAGE_DATA_DIR = "Изображения"
DOWNLOAD_DIR = "rag_files"
JSON_FILES_DIR ="JSON"

GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
HF_REPO_ID = "RAG-AIEXP/ragfiles"
HF_TOKEN = os.getenv('HF_TOKEN')

AVAILABLE_MODELS = {
    "Gemini 2.5 Flash": {
        "provider": "google",
        "model_name": "gemini-2.5-flash",
        "api_key": GOOGLE_API_KEY
    },
    "Gemini 2.5 Pro": {
        "provider": "google", 
        "model_name": "gemini-2.5-pro",
        "api_key": GOOGLE_API_KEY
    },
    "GPT-4o": {
        "provider": "openai",
        "model_name": "gpt-4o",
        "api_key": OPENAI_API_KEY
    },
    "GPT-4o Mini": {
        "provider": "openai",
        "model_name": "gpt-4o-mini", 
        "api_key": OPENAI_API_KEY
    },
    "GPT-5": {
        "provider": "openai",
        "model_name": "gpt-5",
        "api_key": OPENAI_API_KEY
    }
}

DEFAULT_MODEL = "Gemini 2.5 Flash"

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

Как работать с запросом:

1. Выдели в запросе не более 5 ключевых понятий, которые определяют смысл запроса. Это самые главные слова в запросе.
Пример 1: "контроль качества сварных соединений трубопроводной арматуры из стали 20"
Ключевые понятия здесь: "контроль качества", "сварные соединения", "сталь 20"
Пример 2: "требования к штокам трубопроводной арматуры"
Ключевое понятие здесь: "штоки"
Пример 3: "какой контроль мне необходимо провести для материала 08Х18Н10Т, если я использую его для изготовления основных деталей оборудования с классификационным обозначением 3СIIIa ?"
Ключевые понятия здесь: "контроль", "материал 08Х18Н10Т", "основные детали", "классификационное обозначение 3СIIIa" 

2. Если в выделенных ключевых понятиях есть марка стали (например, "20", "09Г2С", "12Х18Н10Т"), добавь ее структурный класс.
Пример 1: "сталь 20" -> "углеродистая сталь 20"
Пример 2: "08Х18Н10Т" -> "аустенитная сталь 08Х18Н10Т"

3. Если в выделенныз ключевых понятиях есть наименование компонента / детали трубопроводной арматуры (например, "штоки", "корпуса", "крепеж"), добавь 2 синонима.

4. К остальным понятиям синонимы НЕ ДОБАВЛЯЙ. НЕ ДОБАВЛЯЙ синонимы к понятию "основные детали"

4. Не выделяй в качестве ключевых понятий слишком общие термины: "трубопроводная арматура", "сталь", "требования", "нормативные документы", "критерии", "материал". 

5. Если в запросе есть нормативный документ, обязательно выдели его в качестве ключевого понятия.

Формат ответа:

Добавь в исходном запросе после каждого ключевого понятия в скобках его повторное упоминание. Если определены синонимы и дополнения, добавь их тажке в скобках через запятую
Пример 1: "требования к штокам трубопроводной арматуры" -> "требования к штокам (штоки, шпиндели, валы) трубопроводной арматуры"
Пример 2: "может ли задвижка DN300 иметь коэффициент сопротивления 3 ?" -> "может ли задвижка (задвижка) DN300 иметь коэффициент сопротивления (коэффициент сопротивления) 3 ?"
Пример 3: "должен ли подвергаться отдельным приемочным испытаниям электропривод головного образца задвижки? Если да, то каким?" -> "должен ли подвергаться отдельным приемочным испытаниям (приемочные испытания) электропривод (электропривод) головного образца (головной образец) задвижки (задвижки) ? Если да, то каким?"

Вопрос пользователя: "{original_query}"
"""

CUSTOM_PROMPT = """
Вы являетесь высокоспециализированным Ассистентом для анализа нормативных документов (AIEXP). Ваша цель - предоставлять точные, корректные и контекстно релевантные ответы исключительно на основе предоставленного контекста из нормативной документации.
СТРОГО ОТВЕТИТЬ ТОЛЬКО НА РУССКОМ!

ПРАВИЛА ФОРМИРОВАНИЯ ОТВЕТОВ:

Работай исключительно с информацией из предоставленного контекста. Запрещено использовать:
- Общие знания
- Информацию из интернета
- Данные из предыдущих диалогов
- Собственные предположения

1. СТРУКТУРА ОТВЕТА:
   - Начинайте с прямого ответа на вопрос
   - Затем указывайте нормативные основания
   - Завершайте ссылками на конкретные документы и разделы

2. РАБОТА С КОНТЕКСТОМ:
   - Если информация найдена в контексте - предоставьте полный ответ
   - Если информация не найдена: "Информация по вашему запросу не найдена в доступной нормативной документации"
   - Не делайте предположений за пределами контекста
   - Не используйте общие знания

3. ТЕРМИНОЛОГИЯ И ЦИТИРОВАНИЕ:
   - Сохраняйте официальную терминологию НД
   - Цитируйте точные формулировки ключевых требований
   - При множественных источниках - укажите все релевантные

4. ФОРМАТИРОВАНИЕ:
   - Для перечислений: используйте нумерованные списки
   - Выделяйте критически важные требования
   - Структурируйте ответ логически

# КАК РАБОТАТЬ С ЗАПРОСОМ

**Шаг 1:** Определи, что именно ищет пользователь (термин, требование, процедура, условие)

**Шаг 2:** Найди релевантную информацию в контексте

**Шаг 3:** Сформируй ответ:
   - Если нашел: укажи документ и пункт, процитируй нужную часть
   - Если не нашел: четко сообщи об отсутствии информации

**Шаг 4:** При наличии нескольких источников:
   - Представь их последовательно с указанием источника каждого
   - Если источников много (>4) — сначала дай их список, потом цитаты   

Контекст: {context_str}

Вопрос: {query_str}

Ответ:
"""