Metadata-Version: 2.2
Name: llm_rag
Version: 0.1
Summary: LLM with RAG
Home-page: https://github.com/mklyazhev/rudn_rag/tree/readme_branch
Author: Vasiliy
Author-email: i@livasan.ru
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: torch==2.2.1
Requires-Dist: transformers==4.40.2
Requires-Dist: langchain==0.1.16
Requires-Dist: langchain-chroma==0.1.1
Requires-Dist: langchain-openai==0.1.7
Requires-Dist: langchain-community==0.0.34
Requires-Dist: langchain-text-splitters==0.0.2
Requires-Dist: gigachat==0.1.35
Requires-Dist: unstructured[md]==0.11.8
Requires-Dist: sentence-transformers==2.7.0
Requires-Dist: bitsandbytes==0.43.1
Requires-Dist: accelerate==0.30.1
Requires-Dist: xformers==0.0.25
Requires-Dist: aiogram==3.6.0
Requires-Dist: loguru==0.7.2
Requires-Dist: pydantic==2.7.1
Requires-Dist: pydantic-settings==2.2.1
Requires-Dist: setuptools
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# Чат-бот РУДН на основе языковой модели GigaChat и RAG

Росcийский университет дружбы народов (РУДН) — это международный университет, объединяющий студентов и специалистов из множества стран мира. Мы стремимся продемонстрировать технологические возможности РУДН и облегчить для будущих студентов процесс погружения в учебные процессы. Для этого мы разработали интеллектуального помощника на основе искусственного интеллекта, который поможет новым студентам быстро находить ответы на интересующие их вопросы и адаптироваться к жизни в университете.

## RAG система

В проекте используется `RAG (Retrieval-Augmented Generation)` — подход, который сочетает поиск информации и генерацию ответов.

![image.png](images/RAG.png)

Это пример простой RAG системы для задач вопроса-ответной формы. Однако эта модель не умела вещей, которые для нас были важны:

1. Помнить контекст
2. Давать релевантный ответ на вопрос, которого нет в базе данных
3. Не отвечать на вопросы не связанные с РУДН

И для реализации вышеперечисленных пунктов мы использовали усовершенствованную RAG систему

## RAG система с агентами

![image.png](images/RAG_with_agent.png)

### **1. Routing (Агент релевантности запроса)**

В проекте используется агент релевантности, который классифицирует вопросы, связанные с РУДН, и отсекает нерелевантные запросы. Если вопрос относится к университету, он передаётся на следующую стадию обработки. Если нет — помощник должен сгенерировать вежливый ответ: "Извините, я отвечаю только на вопросы, связанные с РУДН. 
[src/graph/chains/router.py](https://github.com/mklyazhev/rudn_rag/blob/readme_branch/src/graph/chains/router.py)

### 2. Retriever Node (Поиск по базе)

В системе RAG Retriever Node отвечает за поиск релевантной информации в базе данных, обеспечивая основу для точных ответов. Когда пользователь задаёт вопрос, Retriever Node просматривает документы и выбирает наиболее подходящие фрагменты. Эти данные затем передаются генератору, который на их основе формирует более точный ответ.
[src/graph/nodes/retrieve.py](https://github.com/mklyazhev/rudn_rag/blob/readme_branch/src/graph/chains/router.py)

### 3. Grading Documents Node (Оценка релевантности документов)

Компонент Grading Documents Node оценивает релевантность найденных документов, определяя, насколько каждый из них соответствует запросу пользователя. Он присваивает документам оценки, отражающие их полезность и точность для данного запроса. Этот процесс помогает выбрать наиболее ценные источники для формирования финального ответа, улучшая качество и точность выдачи информации.
[src/graph/nodes/grade.py](https://github.com/mklyazhev/rudn_rag/blob/readme_branch/src/graph/nodes/grade.py)

### 4. Web Search (Поиск в интернете)

Компонент Web Search используется для расширения объёма информации, доступной системе, за счёт поиска данных в интернете. Если внутренние базы данных не содержат нужной информации для ответа, система инициирует веб-поиск, чтобы получить дополнительные релевантные сведения. Это позволяет помощнику предоставлять более полные и актуальные ответы, особенно для запросов, требующих внешних данных.
[src/graph/nodes/web_search.py](https://github.com/mklyazhev/rudn_rag/blob/readme_branch/src/graph/nodes/web_search.py)

### 5. Generating Answers Node (Генерация сообщения)

Компонент Generating Answers Node отвечает за создание финального ответа на основе информации, полученной от других узлов системы. Используя найденные данные, он формирует связный и точный ответ, максимально соответствующий запросу пользователя. Этот узел применяет алгоритмы генерации текста, адаптируя информацию в удобной и понятной форме.
[src/graph/nodes/generate.py](https://github.com/mklyazhev/rudn_rag/blob/readme_branch/src/graph/nodes/generate.py)

### 6. Self-Check Mechanism (Проверка на галлюцинации)

Механизм самокоррекции отвечает за проверку точности сгенерированного ответа, выявляя возможные галлюцинации — то есть неточные или бессмысленные сведения.

- **Отсутствие галлюцинаций:** Если ответ признан корректным, он проходит на следующую стадию проверки.
- **Обнаружение галлюцинаций:** При выявлении неточностей система возвращается к Generating Answers Node, чтобы переформировать ответ и улучшить его точность.

Этот механизм повышает надёжность системы, гарантируя, что пользователи получают достоверную информацию.

[src/graph/chains/hallucination_grader.py](https://github.com/mklyazhev/rudn_rag/blob/readme_branch/src/graph/chains/hallucination_grader.py)

### 7. Validating the Final Answer (Валидация финального ответа)

На этапе валидации финального ответа система проверяет, соответствует ли он заданному вопросу.

- **Да:** Если ответ правильно отвечает на вопрос, он предоставляется пользователю.
- **Нет:** Если ответ недостаточен или неполон, система инициирует веб-поиск для получения дополнительной информации.

[src/graph/chains/answer_grader.py](https://github.com/mklyazhev/rudn_rag/blob/readme_branch/src/graph/chains/answer_grader.py)

## **Как это установить и запустить**

### Установка

Этот код написан на Python 3.10 и требует установки пакетов, перечисленных в файле [requirements.txt](https://github.com/mklyazhev/rudn_rag/blob/readme_branch/requirements.txt)

Используйте следующую команду, чтобы клонировать репозиторий на свой локальный компьютер:

```
git clone https://github.com/mklyazhev/rudn_rag.git -b readme_branch
```

```sh
pip install -r requirements.txt
pip install langgraph==0.2.14
```

В зависимости от того где запускать бота. Необходимо установить следующие штуки. В jupyter notebook можно просто скопировать и вставить в ячейку. 
```
import nltk
nltk.download('punkt_tab')
nltk.download('averaged_perceptron_tagger_eng')
```

В файле [.env.dist](https://github.com/mklyazhev/rudn_rag/blob/readme_branch/.env.dist) передайте ключ от GigaChat и токен телеграмм бота, а также путь к базе данных RAG

### Запуск

 ```
python main.py
```

![image.png](images/launch.png)
