Обновить README.md
This commit is contained in:
@@ -1,108 +1,115 @@
|
|||||||
# Агент с RAG‑памятью
|
# Агент с RAG‑памятью
|
||||||
|
|
||||||
## Описание проекта
|
## Описание проекта
|
||||||
Проект реализует **RAG‑агента** (Retrieval‑Augmented Generation) на базе FastAPI и LangChain, который хранит документы векторно в Qdrant и использует OpenAI GPT‑4 для генерации ответов.
|
Проект реализует **AI‑агента**, способного хранить и извлекать знания из локальной векторной базы данных Qdrant, используя модели Ollama (`llama3` для генерации текста и `nomic-embed-text` для эмбеддингов). Агент использует LangChain для построения цепочки инструментов (RAG) и взаимодействия с пользователем.
|
||||||
- Векторизатор: `OpenAIEmbeddings`
|
|
||||||
- Хранилище: `Qdrant` (локальный сервер или облачный)
|
|
||||||
- Генерация: `ChatOpenAI` (GPT‑4, температура = 0)
|
|
||||||
|
|
||||||
API предоставляет один эндпоинт `/ask`, принимающий вопрос и возвращающий ответ, сформированный на основе найденных векторных документов.
|
> **Ключевые возможности**
|
||||||
|
> * Семантический поиск по базе знаний.
|
||||||
|
> * Добавление новых документов в базу.
|
||||||
|
> * Чанкование больших текстов перед сохранением.
|
||||||
|
> * Интеграция LLM для генерации ответов на основе найденной информации.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Стек технологий
|
||||||
|
|
||||||
|
| Технология | Версия / Пакет |
|
||||||
|
|------------|----------------|
|
||||||
|
| Python | 3.10+ |
|
||||||
|
| Qdrant | v1.x (локальный сервер) |
|
||||||
|
| Ollama | `llama3`, `nomic-embed-text` |
|
||||||
|
| LangChain | `langchain`, `langchain-qdrant`, `langchain-ollama` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Установка зависимостей
|
||||||
|
|
||||||
## Установка зависимостей
|
|
||||||
```bash
|
```bash
|
||||||
# Создайте виртуальное окружение (рекомендуется)
|
# 1. Скачиваем модели Ollama
|
||||||
python -m venv .venv
|
ollama pull llama3
|
||||||
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
ollama pull nomic-embed-text
|
||||||
|
|
||||||
# Установите зависимости из requirements.txt
|
# 2. Устанавливаем Python‑пакеты
|
||||||
pip install -r requirements.txt
|
pip install langchain langchain-qdrant langchain-ollama
|
||||||
```
|
|
||||||
|
|
||||||
`requirements.txt`
|
|
||||||
```text
|
|
||||||
fastapi
|
|
||||||
uvicorn[standard]
|
|
||||||
pydantic
|
|
||||||
langchain
|
|
||||||
openai
|
|
||||||
qdrant-client
|
|
||||||
rich
|
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Важно**
|
> **Важно**
|
||||||
> 1. Запустите сервер Qdrant (локально: `docker run -p 6333:6333 qdrant/qdrant`, облачно – получите URL).
|
> * Qdrant должен быть запущен локально (по умолчанию `localhost:6333`).
|
||||||
> 2. Установите переменную окружения `OPENAI_API_KEY` с вашим ключом OpenAI.
|
> * 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
|
```bash
|
||||||
export QDRANT_URL="http://localhost:6333" # адрес сервера Qdrant (по умолчанию)
|
python solution.py
|
||||||
export QDRANT_COLLECTION="rag_memory" # имя коллекции в Qdrant
|
|
||||||
export OPENAI_API_KEY="sk-..." # ваш ключ OpenAI
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Запуск приложения
|
> Скрипт запускает интерактивный режим: пользователь вводит запрос, агент отвечает, используя найденные векторные документы.
|
||||||
|
> Для тестирования можно добавить примерный документ:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uvicorn solution:app --reload
|
python solution.py --add "title=Python Basics" --content="Python is a high-level programming language..."
|
||||||
```
|
|
||||||
После запуска приложение будет доступно по адресу `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"])
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Автор:** [Ваше имя]
|
## Пример использования
|
||||||
**Дата:** 2026‑05‑28
|
|
||||||
|
### 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 – свободно используйте и модифицируйте код по своему усмотрению.
|
||||||
Reference in New Issue
Block a user