Агент с RAG-памятью: README.md
This commit is contained in:
@@ -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 – свободно используйте и модифицируйте код по своему усмотрению.
|
||||
**Автор:** [Ваше имя]
|
||||
**Дата создания:** 28 мая 2026 г.
|
||||
Reference in New Issue
Block a user