Единый проект объединяет 3 системы:
Little-main/backend— центральный FastAPI backend для чата (/api/chat, SSE).mart_meet— Elasticsearch + индексы чанков (chunking_index) для поиска по документам.cognee-main— дополнительный движок знаний/поиска (опционально).
flowchart LR
UI["Frontend / Client"] -->|POST /api/chat| RAG["Little backend\n(FastAPI + SSE)"]
RAG -->|embed query| OLLAMA["Ollama"]
RAG -->|vector search| ES1["Elasticsearch\nknowledge_base"]
RAG -->|vector+text search| ES2["Elasticsearch\nchunking_index (mart_meet)"]
RAG -->|optional HTTP search| COG["Cognee API"]
RAG -->|SSE: sources/token/done| UI
Как это работает:
- Клиент отправляет сообщение в
Littlebackend (POST /api/chat). - Backend строит embedding запроса через Ollama.
- Backend собирает документы из:
knowledge_base(legacy индекс),chunking_index(индекс изmart_meet),cognee(если включеноRAG_COGNEE_ENABLED=true).
- Backend объединяет результаты, формирует контекст и стримит ответ токенами через SSE.
- Docker Desktop (или Docker Engine + Compose).
- Запущенный Ollama (локально или удаленно).
- Windows PowerShell (для
run-unified.ps1).
Из корня проекта:
Copy-Item .env.example .env
.\run-unified.ps1Что запустится:
elasticsearchнаhttp://localhost:9200rag-backendнаhttp://localhost:8000
Опции:
# добавить Cognee API
.\run-unified.ps1 -WithCognee
# добавить Kibana
.\run-unified.ps1 -WithDebugCopy-Item .env.example .env
docker compose up -d --buildС профилями:
docker compose --profile cognee up -d --build
docker compose --profile debug up -d --buildGET http://localhost:8000/api/healthОжидается:
{"status":"ok"}POST http://localhost:8000/api/chat
Content-Type: application/json
{
"session_id": "test-session-1",
"message": "Что ты знаешь по теме документа?"
}События потока:
sources— найденные источникиtoken— фрагменты ответаdone— завершениеerror— ошибка
Поведение ответов в прод-режиме:
- Если релевантные материалы не найдены, ответ формируется как обычный LLM-ответ и в конце добавляется явная пометка:
ответ сгенерирован без опоры на загруженные учебные материалы. - Если материалы найдены, в конце ответа добавляется блок
[Источники]со ссылками на конкретные chunks:/api/documents/source/{index_name}/{doc_id}
Новый endpoint в rag-backend:
POST /api/documents/upload (multipart/form-data)
Параметры:
file— файл (txt,pdf,docx)dataset_name— имя датасета в Cognee (по умолчаниюuser_uploads)run_cognify— запускать лиcognifyпослеadd(по умолчаниюtrue)chunk_size— размер чанка (опционально)chunk_overlap— overlap чанков (опционально)
Пример:
curl.exe -X POST "http://localhost:8000/api/documents/upload" `
-F "file=@C:\path\to\document.pdf" `
-F "dataset_name=user_docs" `
-F "run_cognify=true"Endpoint делает оба шага параллельно:
- Чанки + эмбеддинги в Elasticsearch (
knowledge_base) add+cognifyв Cognee
- Поднимите Cognee профиль:
docker compose --profile cognee up -d --build- Запустите готовый smoke test:
powershell -ExecutionPolicy Bypass -File .\smoke-test-cognee.ps1Скрипт делает полный цикл:
addдокумента в dataset,cognifyдля построения графа сущностей и связей,searchсGRAPH_COMPLETIONдля проверки долгосрочной памяти.
Основные:
RAG_ELASTICSEARCH_URL— адрес Elasticsearch.RAG_ELASTICSEARCH_INDEX— legacy индекс (knowledge_base).RAG_ELASTICSEARCH_MART_INDEX— индексmart_meet(chunking_index).RAG_OLLAMA_URL— адрес Ollama.RAG_OLLAMA_MODEL— модель генерации.RAG_OLLAMA_EMBED_MODEL— модель эмбеддингов.
Флаги источников:
RAG_RAG_ENABLE_LEGACY_INDEX=true|falseRAG_RAG_ENABLE_MART_INDEX=true|falseRAG_COGNEE_ENABLED=true|false
Cognee (если включен):
RAG_COGNEE_URL(в docker-сети обычноhttp://cognee-api:8000)RAG_COGNEE_SEARCH_TYPE(напримерCHUNKS)RAG_COGNEE_API_TOKEN(если требуется авторизация)
Персистентность Cognee:
- База Cognee сохраняется на хосте в
./data/cognee/databases - Логи Cognee сохраняются в
./data/cognee/logs
- Агрегация поиска:
Little-main/backend/app/services/rag_service.py - Интеграция с Cognee:
Little-main/backend/app/services/cognee_service.py - Конфиг проекта:
Little-main/backend/app/config.py - Единый compose:
docker-compose.yml
docker engine not found— Docker daemon не запущен.- Пустой ответ в чате — проверьте доступность Ollama и корректность моделей.
- Нет документов из
mart_meet— убедитесь, что индексchunking_indexсуществует в Elasticsearch. - Нет результатов из Cognee — включите
RAG_COGNEE_ENABLED=trueи проверьтеRAG_COGNEE_URL/токен. - В
SSE tokenответ может приходить частями (по слогам/подстрокам) — это нормальный streaming-поведение.