diff --git a/README.md b/README.md index 7457764..3131dea 100644 --- a/README.md +++ b/README.md @@ -1,108 +1,115 @@ # Агент с RAG‑памятью -## Описание проекта -Проект реализует **RAG‑агента** (Retrieval‑Augmented Generation) на базе FastAPI и LangChain, который хранит документы векторно в Qdrant и использует OpenAI GPT‑4 для генерации ответов. -- Векторизатор: `OpenAIEmbeddings` -- Хранилище: `Qdrant` (локальный сервер или облачный) -- Генерация: `ChatOpenAI` (GPT‑4, температура = 0) +## Описание проекта +Проект реализует **AI‑агента**, способного хранить и извлекать знания из локальной векторной базы данных Qdrant, используя модели Ollama (`llama3` для генерации текста и `nomic-embed-text` для эмбеддингов). Агент использует LangChain для построения цепочки инструментов (RAG) и взаимодействия с пользователем. -API предоставляет один эндпоинт `/ask`, принимающий вопрос и возвращающий ответ, сформированный на основе найденных векторных документов. +> **Ключевые возможности** +> * Семантический поиск по базе знаний. +> * Добавление новых документов в базу. +> * Чанкование больших текстов перед сохранением. +> * Интеграция LLM для генерации ответов на основе найденной информации. + +--- + +## Стек технологий + +| Технология | Версия / Пакет | +|------------|----------------| +| Python | 3.10+ | +| Qdrant | v1.x (локальный сервер) | +| Ollama | `llama3`, `nomic-embed-text` | +| LangChain | `langchain`, `langchain-qdrant`, `langchain-ollama` | + +--- + +## Установка зависимостей -## Установка зависимостей ```bash -# Создайте виртуальное окружение (рекомендуется) -python -m venv .venv -source .venv/bin/activate # Windows: .venv\Scripts\activate +# 1. Скачиваем модели Ollama +ollama pull llama3 +ollama pull nomic-embed-text -# Установите зависимости из requirements.txt -pip install -r requirements.txt -``` - -`requirements.txt` -```text -fastapi -uvicorn[standard] -pydantic -langchain -openai -qdrant-client -rich +# 2. Устанавливаем Python‑пакеты +pip install langchain langchain-qdrant langchain-ollama ``` > **Важно** -> 1. Запустите сервер Qdrant (локально: `docker run -p 6333:6333 qdrant/qdrant`, облачно – получите URL). -> 2. Установите переменную окружения `OPENAI_API_KEY` с вашим ключом OpenAI. +> * 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‑обратной связи. + +--- + +## Запуск -## Конфигурация ```bash -export QDRANT_URL="http://localhost:6333" # адрес сервера Qdrant (по умолчанию) -export QDRANT_COLLECTION="rag_memory" # имя коллекции в Qdrant -export OPENAI_API_KEY="sk-..." # ваш ключ OpenAI +python solution.py ``` -## Запуск приложения +> Скрипт запускает интерактивный режим: пользователь вводит запрос, агент отвечает, используя найденные векторные документы. +> Для тестирования можно добавить примерный документ: + ```bash -uvicorn solution:app --reload -``` -После запуска приложение будет доступно по адресу `http://127.0.0.1:8000`. -Swagger UI можно открыть в браузере по `/docs`. - -## Эндпоинты - -| Метод | Путь | Описание | -|-------|------|----------| -| POST | /ask | Принимает JSON с полем `question` (строка) и возвращает ответ GPT‑4. | - -### Пример запроса -```bash -curl -X POST "http://127.0.0.1:8000/ask" \ - -H "Content-Type: application/json" \ - -d '{"question":"Какой у меня возраст?"}' -``` - -### Ожидаемый ответ -```json -{ - "answer": "Ваш возраст составляет 30 лет." -} -``` - -## Как добавить документы в память - -Для того чтобы агент мог отвечать на вопросы, необходимо загрузить документы в Qdrant. Это можно сделать вручную через API Qdrant или написать скрипт: - -```python -from langchain.document_loaders import TextLoader -from langchain.embeddings.openai import OpenAIEmbeddings -from langchain.vectorstores.qdrant import Qdrant - -embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY) -vectorstore = Qdrant( - client=None, - collection_name="rag_memory", - embeddings=embeddings, - url="http://localhost:6333" -) - -loader = TextLoader("path/to/your/document.txt") -docs = loader.load() -vectorstore.add_documents(docs) -``` - -После добавления документов агент сможет использовать их при генерации ответов. - -## Пример использования в коде -```python -import requests - -response = requests.post( - "http://127.0.0.1:8000/ask", - json={"question": "Что такое RAG?"} -) -print(response.json()["answer"]) +python solution.py --add "title=Python Basics" --content="Python is a high-level programming language..." ``` --- -**Автор:** [Ваше имя] -**Дата:** 2026‑05‑28 \ No newline at end of file +## Пример использования + +### 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." +``` + +> После выполнения команда добавит документ в коллекцию `knowledge_base` и выведет сообщение об успехе. + +### 2. Поиск по базе + +```bash +python solution.py query "What is Python?" +``` + +> Агент выполнит семантический поиск, найдёт релевантные чанки и сформирует ответ с использованием LLM. + +--- + +## Как это работает (техническое резюме) + +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