Агент с RAG‑памятью: README.md
This commit is contained in:
@@ -1,115 +1,115 @@
|
|||||||
# Агент с RAG‑памятью
|
# Агент с RAG‑памятью
|
||||||
|
|
||||||
## Описание проекта
|
## Описание проекта
|
||||||
|
Проект реализует **AI‑агента**, способного хранить и извлекать знания из локальной векторной базы данных Qdrant, используя модели Ollama (`llama3` для генерации текста и `nomic-embed-text` для эмбеддингов). Агент использует LangChain для построения цепочки инструментов (RAG) и взаимодействия с пользователем.
|
||||||
|
|
||||||
`solution.py` реализует AI‑агента, способного хранить и извлекать знания из локальной векторной базы Qdrant при помощи Ollama (LLM `llama3` и эмбеддинговая модель `nomic-embed-text`).
|
> **Ключевые возможности**
|
||||||
Агент использует LangChain для:
|
> * Семантический поиск по базе знаний.
|
||||||
|
> * Добавление новых документов в базу.
|
||||||
|
> * Чанкование больших текстов перед сохранением.
|
||||||
|
> * Интеграция LLM для генерации ответов на основе найденной информации.
|
||||||
|
|
||||||
* **RAG** – Retrieval‑Augmented Generation
|
---
|
||||||
* Инструменты поиска (`search_knowledge_base`) и добавления (`add_to_knowledge_base`) в базу знаний
|
|
||||||
* Чанкинга больших документов через `RecursiveCharacterTextSplitter`
|
|
||||||
* Взаимодействия с Qdrant через `QdrantVectorStore`
|
|
||||||
|
|
||||||
## Стек технологий
|
## Стек технологий
|
||||||
|
|
||||||
| Технология | Версия |
|
| Технология | Версия / Пакет |
|
||||||
|------------|--------|
|
|------------|----------------|
|
||||||
| Python | 3.10+ |
|
| Python | 3.10+ |
|
||||||
| Ollama | 0.1+ |
|
| Qdrant | v1.x (локальный сервер) |
|
||||||
| Qdrant | 1.x |
|
| Ollama | `llama3`, `nomic-embed-text` |
|
||||||
| LangChain | 0.2+ |
|
| LangChain | `langchain`, `langchain-qdrant`, `langchain-ollama` |
|
||||||
|
|
||||||
## Установка зависимостей
|
---
|
||||||
|
|
||||||
|
## Установка зависимостей
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1️⃣ Загрузить модели в Ollama
|
# 1. Скачиваем модели Ollama
|
||||||
ollama pull llama3
|
ollama pull llama3
|
||||||
ollama pull nomic-embed-text
|
ollama pull nomic-embed-text
|
||||||
|
|
||||||
# 2️⃣ Установить Python‑пакеты
|
# 2. Устанавливаем Python‑пакеты
|
||||||
pip install langchain langchain-qdrant langchain-ollama
|
pip install langchain langchain-qdrant langchain-ollama
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Важно**
|
> **Важно**
|
||||||
> Qdrant должен быть запущен локально (по умолчанию `localhost:6333`).
|
> * Qdrant должен быть запущен локально (по умолчанию `localhost:6333`).
|
||||||
> Если у вас нет Docker, установите Qdrant через официальную инструкцию:
|
> * Ollama сервис также должен работать в фоне.
|
||||||
> ```bash
|
|
||||||
> docker run -p 6333:6333 qdrant/qdrant
|
---
|
||||||
> ```
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── solution.py # основной скрипт с реализацией агента
|
||||||
|
└── README.md # эта документация
|
||||||
|
```
|
||||||
|
|
||||||
|
`solution.py` содержит:
|
||||||
|
1. Конфигурацию подключения к Qdrant и Ollama.
|
||||||
|
2. Два инструмента (`search_knowledge_base`, `add_to_knowledge_base`) – реализованы через декоратор `@tool`.
|
||||||
|
3. Логику чанкования с помощью `RecursiveCharacterTextSplitter`.
|
||||||
|
4. Создание агента, который использует LLM и инструменты для RAG‑обратной связи.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Запуск
|
## Запуск
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python solution.py --help
|
python solution.py
|
||||||
```
|
```
|
||||||
|
|
||||||
### Основные команды
|
> Скрипт запускает интерактивный режим: пользователь вводит запрос, агент отвечает, используя найденные векторные документы.
|
||||||
|
> Для тестирования можно добавить примерный документ:
|
||||||
| Флаг | Описание |
|
|
||||||
|------|----------|
|
|
||||||
| `--add FILE` | Добавить документ из файла в базу знаний |
|
|
||||||
| `--search QUERY [--max N]` | Выполнить семантический поиск по базе |
|
|
||||||
| `--agent` | Запустить интерактивного агента, который сам будет использовать RAG |
|
|
||||||
|
|
||||||
#### Пример добавления документа
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python solution.py --add docs/guide.txt
|
python solution.py --add "title=Python Basics" --content="Python is a high-level programming language..."
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Пример поиска
|
---
|
||||||
|
|
||||||
|
## Пример использования
|
||||||
|
|
||||||
|
### 1. Добавление документа
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python solution.py --search "Как настроить Qdrant?" --max 5
|
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
|
```bash
|
||||||
python solution.py --agent
|
python solution.py query "What is Python?"
|
||||||
```
|
```
|
||||||
|
|
||||||
После запуска агент будет ждать ваших вопросов и отвечать, используя найденную информацию из базы.
|
> Агент выполнит семантический поиск, найдёт релевантные чанки и сформирует ответ с использованием LLM.
|
||||||
|
|
||||||
## Пример использования в коде
|
---
|
||||||
|
|
||||||
```python
|
## Как это работает (техническое резюме)
|
||||||
from langchain_ollama import ChatOllama
|
|
||||||
from langchain_qdrant import QdrantVectorStore
|
|
||||||
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
|
||||||
from langchain.tools import tool
|
|
||||||
from langchain.agents import create_agent, AgentExecutor, Tool
|
|
||||||
from langchain.schema import Document
|
|
||||||
|
|
||||||
# Инициализация клиента Qdrant
|
1. **Чанкование** – `RecursiveCharacterTextSplitter` разбивает большие тексты на части длиной до 1000 символов с перекрытием 200.
|
||||||
store = QdrantVectorStore(
|
2. **Эмбеддинг** – каждая часть преобразуется в эмбеддинги через Ollama (`nomic-embed-text`) и сохраняется в Qdrant.
|
||||||
url="http://localhost:6333",
|
3. **Поиск** – при запросе агент использует `search_knowledge_base`, который ищет ближайшие векторы в коллекции, возвращая топ‑N документов.
|
||||||
collection_name="knowledge_base",
|
4. **Ответ** – LLM (`llama3`) генерирует финальный ответ, опираясь на найденные документы.
|
||||||
embedding_function=OllamaEmbeddings(model="nomic-embed-text")
|
|
||||||
)
|
|
||||||
|
|
||||||
# Чанкинг текста
|
---
|
||||||
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
|
|
||||||
docs = splitter.split_text("Многострочный текст...")
|
|
||||||
|
|
||||||
# Добавление в базу
|
## Расширение проекта
|
||||||
store.add_documents([Document(page_content=d) for d in docs])
|
|
||||||
|
|
||||||
# Поиск
|
- Добавить поддержку нескольких моделей Ollama.
|
||||||
results = store.similarity_search_with_score("Как настроить Qdrant?", k=3)
|
- Интегрировать хранение метаданных (дата добавления, автор).
|
||||||
|
- Реализовать удаление/обновление документов через инструменты.
|
||||||
|
- Создать веб‑интерфейс на FastAPI для удобного взаимодействия.
|
||||||
|
|
||||||
for doc, score in results:
|
---
|
||||||
print(f"[{score:.2f}] {doc.page_content[:200]}...")
|
|
||||||
```
|
|
||||||
|
|
||||||
## Структура проекта
|
## Лицензия
|
||||||
|
|
||||||
```
|
MIT License – свободно используйте и модифицируйте код по своему усмотрению.
|
||||||
project/
|
|
||||||
├── solution.py # Основной скрипт
|
|
||||||
└── docs/ # Пример документов для добавления
|
|
||||||
```
|
|
||||||
|
|
||||||
## Лицензия
|
|
||||||
|
|
||||||
MIT © 2026.
|
|
||||||
Reference in New Issue
Block a user