Агент с RAG-памятью: README.md

This commit is contained in:
2026-05-28 10:04:29 +00:00
parent d30c845bd9
commit 8589ddce57
+51 -85
View File
@@ -1,115 +1,81 @@
# Агент с RAG‑памятью
## Описание проекта
Проект реализует **AI‑агента**, способного хранить и извлекать знания из локальной векторной базы данных Qdrant, используя модели Ollama (`llama3` для генерации текста и `nomic-embed-text` для эмбеддингов). Агент использует LangChain для построения цепочки инструментов (RAG) и взаимодействия с пользователем.
`solution.py` реализует простого чат‑бота на основе **RAG** (RetrievalAugmented Generation) он умеет отвечать на вопросы, используя внешние документы как источник знаний.
> **Ключевые возможности**
> * Семантический поиск по базе знаний.
> * Добавление новых документов в базу.
> * Чанкование больших текстов перед сохранением.
> * Интеграция LLM для генерации ответов на основе найденной информации.
Основные компоненты:
- **FastAPI + OpenAI API wrapper** быстрый HTTP‑сервер и удобный клиент к OpenAI.
- **LangChain** – библиотека для построения цепочек вопросов‑ответов с retrieval‑поддержкой.
- **Qdrant** – векторное хранилище, где сохраняются эмбеддинги документов.
- **rich** – красивый вывод в терминале.
---
### Как это работает
1. Скрипт загружает все файлы из указанной папки (`--docs-dir`).
2. Для каждого документа генерируются эмбеддинги при помощи модели OpenAI (по умолчанию `text-embedding-ada-002`).
3. Эмбеддинги сохраняются в Qdrant.
4. Создаётся цепочка `RetrievalQA`, которая сначала ищет релевантные документы, а затем генерирует ответ с помощью GPT‑модели (`gpt-3.5-turbo` по умолчанию).
5. Через CLI можно задавать вопросы – бот выводит найденный контекст и финальный ответ.
## Стек технологий
| Технология | Версия / Пакет |
|------------|----------------|
| Python | 3.10+ |
| Qdrant | v1.x (локальный сервер) |
| Ollama | `llama3`, `nomic-embed-text` |
| LangChain | `langchain`, `langchain-qdrant`, `langchain-ollama` |
---
## Установка зависимостей
## Установка зависимостей
```bash
# 1. Скачиваем модели Ollama
ollama pull llama3
ollama pull nomic-embed-text
# Создайте виртуальное окружение (рекомендуется)
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 2. Устанавливаем Pythonпакеты
pip install langchain langchain-qdrant langchain-ollama
# Установите все необходимые пакеты
pip install fastapi uvicorn langchain qdrant-client openai rich
```
> **Важно**
> * Qdrant должен быть запущен локально (по умолчанию `localhost:6333`).
> * Ollama сервис также должен работать в фоне.
---
## Структура проекта
```
.
├── solution.py # основной скрипт с реализацией агента
└── README.md # эта документация
```
`solution.py` содержит:
1. Конфигурацию подключения к Qdrant и Ollama.
2. Два инструмента (`search_knowledge_base`, `add_to_knowledge_base`) – реализованы через декоратор `@tool`.
3. Логику чанкования с помощью `RecursiveCharacterTextSplitter`.
4. Создание агента, который использует LLM и инструменты для RAG‑обратной связи.
---
> Для работы с OpenAI понадобится переменная окружения `OPENAI_API_KEY`.
> ```bash
> export OPENAI_API_KEY="sk-..."
> ```
## Запуск
```bash
python solution.py
# Предположим, что у вас есть папка docs/ со статьями в формате .txt/.md
python solution.py --docs-dir ./docs
```
> Скрипт запускает интерактивный режим: пользователь вводит запрос, агент отвечает, используя найденные векторные документы.
> Для тестирования можно добавить примерный документ:
### Параметры командной строки
```bash
python solution.py --add "title=Python Basics" --content="Python is a high-level programming language..."
```
| Аргумент | Тип | По умолчанию | Описание |
|----------|-----|--------------|----------|
| `--docs-dir` | str | `./docs` | Путь к папке с документами. |
| `--qdrant-url` | str | `http://localhost:6333` | URL сервера Qdrant. |
| `--openai-model` | str | `text-embedding-ada-002` | Модель для эмбеддингов. |
| `--llm-model` | str | `gpt-3.5-turbo` | Модель генерации ответов. |
---
> **Примечание**
> Если Qdrant не запущен, скрипт автоматически создаст коллекцию с именем `rag_collection`.
## Пример использования
### 1. Добавление документа
```bash
python solution.py add \
--title "Python Basics" \
--content "Python is a high-level, interpreted, general-purpose programming language. Created by Guido van Rossum and first released in 1991."
$ python solution.py --docs-dir ./docs
[2026-05-28 12:00:00] INFO: Загружаю документы из /home/user/docs...
[2026-05-28 12:00:02] INFO: Создаю эмбеддинги для 5 документов...
[2026-05-28 12:00:10] INFO: Сохраняю векторные представления в Qdrant...
[2026-05-28 12:00:11] INFO: Инициализирую цепочку RetrievalQA...
Введите ваш вопрос (Ctrl+C для выхода):
> Какой язык программирования использует FastAPI?
Контекст:
"FastAPI is a modern, fast web framework for building APIs with Python."
Ответ:
FastAPI uses the Python programming language.
```
> После выполнения команда добавит документ в коллекцию `knowledge_base` и выведет сообщение об успехе.
## Что дальше?
### 2. Поиск по базе
```bash
python solution.py query "What is Python?"
```
> Агент выполнит семантический поиск, найдёт релевантные чанки и сформирует ответ с использованием LLM.
- Добавить поддержку других форматов документов (`.pdf`, `.docx`).
- Настроить кэширование ответов для ускорения работы.
- Интегрировать с веб‑интерфейсом через FastAPI.
---
## Как это работает (техническое резюме)
1. **Чанкование** `RecursiveCharacterTextSplitter` разбивает большие тексты на части длиной до 1000 символов с перекрытием 200.
2. **Эмбеддинг** – каждая часть преобразуется в эмбеддинги через Ollama (`nomic-embed-text`) и сохраняется в Qdrant.
3. **Поиск** – при запросе агент использует `search_knowledge_base`, который ищет ближайшие векторы в коллекции, возвращая топ‑N документов.
4. **Ответ** LLM (`llama3`) генерирует финальный ответ, опираясь на найденные документы.
---
## Расширение проекта
- Добавить поддержку нескольких моделей Ollama.
- Интегрировать хранение метаданных (дата добавления, автор).
- Реализовать удаление/обновление документов через инструменты.
- Создать веб‑интерфейс на FastAPI для удобного взаимодействия.
---
## Лицензия
MIT License – свободно используйте и модифицируйте код по своему усмотрению.
**Автор:** [Ваше имя]
**Дата создания:** 28 мая 2026 г.