Conversation
|
@claude проанализируй правки в этом плуреквесте и дай отчет. |
2 similar comments
|
@claude проанализируй правки в этом плуреквесте и дай отчет. |
|
@claude проанализируй правки в этом плуреквесте и дай отчет. |
|
Claude finished @Menzorg's task in 2m 17s —— View job Анализ PR: RAG Integration Prototype
ОбзорPR содержит 1362 добавленных / 31 удалённых строк в 18 файлах. Изменения охватывают три основные области:
1. RAG-интеграцияСхема БД (
|
| Функция | Тип |
|---|---|
search_concrete_chunks |
TSV-first, RRF с векторным переранжированием |
search_abstract_chunks |
Vector-first, TSV как дополнительный сигнал |
search_concrete_table_rows |
TSV-first для табличных строк |
search_abstract_table_rows |
Vector-first для табличных строк |
search_related_docs |
Поиск релевантных документов (2 режима) |
search_rag |
Unified dispatcher → чанки или табличные строки |
get_expanded_context |
Расширение окна вокруг лучшего чанка |
Хорошо: корректная логика fallback (TSV → vector, concrete → abstract), GREATEST(p_top_k * 10, 50) как pool size, STABLE пометка функций.
Проблема — хардкод порогового расстояния: В search_related_docs (abstract-ветка, строка ~465) стоит WHERE r.vec_dist < 0.5. При отсутствии близких документов результат будет пустым — без возможности контроля из Python. Fix this →
Проблема — несогласованность tsquery: search_concrete_chunks использует websearch_to_tsquery, остальные функции — plainto_tsquery. Для однородного поведения лучше использовать один вариант. Fix this →
RAG Tool (rag_tool.py)
Полная реализация вместо стаба: двухэтапный поиск — сначала search_related_docs (до 3 документов), затем search_rag для каждого документа.
Критическая проблема — создание пула на каждый вызов:
# rag_tool.py:46-47
pool = await asyncpg.create_pool(Config.get_postgres_dsn(), min_size=1, max_size=2)Каждый вызов rag_search создаёт новый asyncpg connection pool и закрывает его в finally. Это крайне неэффективно: установка соединения с PostgreSQL занимает ~50-200ms, а при параллельных запросах создаётся множество коннектов. Нужно передавать существующий пул из EngineService. Fix this →
Проблема — импорт внутри функции:
# rag_tool.py:129
import concurrent.futuresИмпорт внутри функции вместо верхнего уровня модуля — нарушает соглашения PEP 8.
Проблема — asyncio.run в потоке:
# rag_tool.py:130-135
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(asyncio.run, _search_rag_async(...))
return future.result(timeout=120)Workaround корректен для синхронного LangChain tool в async FastAPI, но вместе с проблемой создания нового пула это удваивает накладные расходы. Fix this →
Конфигурация (config.py)
EMBEDDING_MODEL = os.getenv("EMBEDDING_MODEL", "nomic-embed-text-v2-moe:latest")Добавлен get_vector_dsn() для psycopg3 формата (не используется текущей реализацией RAG, где применяется asyncpg через get_postgres_dsn()).
2. Планировщик задач (scheduler_service.py)
Ключевое изменение: Подключены _run_morning_polls_for_org и _run_evening_reports_for_org — задачи, которые ранее числились как "не подключены" в alpha-features-report.
Логика корректна:
- Timezone-aware: использует
ZoneInfoдля определения локального часа организации - Idempotent: проверяет существование опроса через
create_daily_poll() - Вечерние отчёты генерируются для всех admin'ов организации
Небольшая проблема в list_distinct_assignees (task_storage.py:124): запрос фильтрует status NOT IN ('done'), но не исключает 'overdue'. Значит сотрудникам с просроченными задачами будут ежедневно создаваться утренние опросы — возможно это ожидаемое поведение (опрос нужен чтобы обновить статус), но стоит убедиться. Fix this →
3. AgentExecutor (executor.py)
Добавлена инъекция org_id и user_id в RunnableConfig для всех агентов:
config = RunnableConfig(configurable={
"org_id": str(role.org_id) if role.org_id else "",
"user_id": str(user_id) if user_id else "",
})Это необходимо для RAG tool. Правильный подход.
Также добавлен TODO-комментарий (строки 89-96) для инъекции correction rules через RAG — это технический долг, зафиксированный явно, что хорошо.
4. Storage additions
task_storage.py: добавлены list_distinct_assignees() и list_active_for_polls() — необходимы для планировщика.
user_storage.py: добавлен list_admins_by_org() — для вечерних отчётов. Корректно фильтрует is_system = false, исключая AI-пользователей.
5. Requirements
-psycopg2-binary>=2.9.0
-langchain-postgres>=0.0.12
+langchain-community>=0.3.0Убраны psycopg2-binary и langchain-postgres (видимо, были попытки использовать PGVector через LangChain, но финальная реализация использует сырой asyncpg). Добавлен langchain-community.
6. Документация
docs/alpha-features-report.md — подробный статус всех альфа-фич с таблицей готовности. Полезно.
docs/tech-debt.md — список проблем в deploy.sh (6 пунктов для rugpt, 4 для webclient). Критичные: нет set -e, нет рестарта uvicorn, нет автомиграций при деплое.
Итоговая оценка
| Область | Статус | Комментарий |
|---|---|---|
| RAG схема БД | ✅ Хорошо | Продуманная структура, правильные индексы |
| RAG SQL функции | Хардкод порога 0.5, несогласованность tsquery | |
| RAG tool Python | ❌ Критично | Создание нового пула на каждый вызов |
| Планировщик | ✅ Хорошо | Корректная timezone-aware реализация |
| content_hash | Колонка добавлена, но не заполняется | |
| Документация | ✅ Хорошо | Ценные отчёты по состоянию системы |
Главное к исправлению перед мержем: переработать rag_tool.py для переиспользования существующего pool вместо создания нового на каждый запрос.
|
@claude ты можешь создать коммит в этом пуллреквесте который бы исправлял проблему с созданием нового пулла на каждый вызов? |
|
Claude finished @Menzorg's task in 3m 18s —— View job Исправление: пул соединений в rag_tool.py
Коммит Что изменено
Почему такСуществующий |
- Add module-level _pool singleton and init_rag_pool() initializer - Make rag_search an async tool (removes ThreadPoolExecutor + asyncio.run overhead) - Remove per-call asyncpg.create_pool / pool.close in _search_rag_async - Wire user_file_storage.pg_pool into RAG tool during engine initialization - Remove unused concurrent.futures import Co-authored-by: Menzorg <Menzorg@users.noreply.github.com>
…_timezone fix: it was implemented in python, but not in migrations until now
…ate executor for ingestion tasks
…uch more logging of ingestion process
rag integration prototype and fixes