diff --git a/README.md b/README.md index 3131dea..0d06bef 100644 --- a/README.md +++ b/README.md @@ -1,115 +1,81 @@ # Агент с RAG‑памятью ## Описание проекта -Проект реализует **AI‑агента**, способного хранить и извлекать знания из локальной векторной базы данных Qdrant, используя модели Ollama (`llama3` для генерации текста и `nomic-embed-text` для эмбеддингов). Агент использует LangChain для построения цепочки инструментов (RAG) и взаимодействия с пользователем. +`solution.py` реализует простого чат‑бота на основе **RAG** (Retrieval‑Augmented 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 – свободно используйте и модифицируйте код по своему усмотрению. \ No newline at end of file +**Автор:** [Ваше имя] +**Дата создания:** 28 мая 2026 г. \ No newline at end of file