Skip to content

Commit 9767baa

Browse files
Wunderwaffelh0842398z423gLeonFrasch
authored
DB Request Optimisation (#49)
* Feature/frontend pdfchat (#47) * backend implementation of the ai chat feature with (frontend) updated openapi generator, pinia store for chats and service to run chat * fix provider: cast input messages * rerun openapi generator and resolved lint error * unify paper and chat domains and regenerate api client * removed old files (chat dto, routes, services) and updated papers.ts * lint * feat(frontend): Add Chat with PDF side panel - Add ChatMessage.vue atom for rendering user/AI messages - Add ChatPanel.vue resizable side panel with chat interface - Integrate chat panel into PdfViewerDialog with toggle button - Fix import path in chat store (paperService -> papers) * Improve chat UI: better contrast, maximize button, theme toggle * Update OpenAI provider --------- Co-authored-by: ge87pot <ge87pot@tum.de> Co-authored-by: Wunderwaffel <37752072+Wunderwaffel@users.noreply.github.com> * Feature/frontend pdfchat (#47) * backend implementation of the ai chat feature with (frontend) updated openapi generator, pinia store for chats and service to run chat * fix provider: cast input messages * rerun openapi generator and resolved lint error * unify paper and chat domains and regenerate api client * removed old files (chat dto, routes, services) and updated papers.ts * lint * feat(frontend): Add Chat with PDF side panel - Add ChatMessage.vue atom for rendering user/AI messages - Add ChatPanel.vue resizable side panel with chat interface - Integrate chat panel into PdfViewerDialog with toggle button - Fix import path in chat store (paperService -> papers) * Improve chat UI: better contrast, maximize button, theme toggle * Update OpenAI provider --------- Co-authored-by: ge87pot <ge87pot@tum.de> Co-authored-by: Wunderwaffel <37752072+Wunderwaffel@users.noreply.github.com> * Fixed numpy version --------- Co-authored-by: h0842398z423g <hannes321gerl@gmail.com> Co-authored-by: ge87pot <ge87pot@tum.de>
1 parent e798add commit 9767baa

3 files changed

Lines changed: 35 additions & 17 deletions

File tree

backend/app/core/database.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from importlib import import_module
55
from typing import AsyncGenerator
66

7-
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
7+
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
88
from sqlalchemy.orm import declarative_base
99

1010
from app.core.config import settings
@@ -14,10 +14,12 @@
1414
Base = declarative_base()
1515

1616
# Use async engine with asyncpg or aiomysql driver
17+
# Set probes for the vector index for every connection
1718
engine = create_async_engine(
1819
settings.DATABASE_URL,
1920
echo=(settings.ENVIRONMENT == "dev"),
2021
future=True,
22+
connect_args={"server_settings": {"ivfflat.probes": "50"}},
2123
)
2224

2325
async_session_local = async_sessionmaker(
@@ -32,11 +34,11 @@
3234
async def init_db() -> None:
3335
"""Automatically create or update tables based on SQLAlchemy models."""
3436
for module in (
35-
"app.models.user",
36-
"app.models.project",
37-
"app.models.paper",
38-
"app.models.project_paper",
39-
"app.models.paper_content",
37+
"app.models.user",
38+
"app.models.project",
39+
"app.models.paper",
40+
"app.models.project_paper",
41+
"app.models.paper_content",
4042
):
4143
import_module(module)
4244

backend/app/repositories/search_repository.py

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from datetime import date
22
from typing import List, Optional, Tuple, Union
33

4+
import numpy as np
45
from sqlalchemy import ColumnElement, and_, or_, select
56
from sqlalchemy.ext.asyncio import AsyncSession
67

@@ -34,26 +35,40 @@ async def search_papers_by_embeddings(
3435
Returns a list of (PaperModel, avg_distance) tuples ordered by ascending distance.
3536
Optionally applies advanced search filters (year range, text conditions).
3637
"""
38+
# Compute centroid of all extracted search queries, so we can use the IVF index for
39+
# efficient vector searches
40+
vecs = np.array(embeddings, dtype=np.float32)
41+
q = vecs.mean(axis=0)
42+
q /= np.linalg.norm(q) + 1e-12
43+
q_list = q.tolist()
44+
45+
cand_stmt = (
46+
select(PaperModel.paper_id)
47+
.order_by(PaperModel.embedding.cosine_distance(q_list))
48+
.limit(500)
49+
)
50+
51+
if search_filter:
52+
clauses = SearchRepository._build_filter_clauses(search_filter)
53+
if clauses:
54+
cand_stmt = cand_stmt.where(and_(*clauses))
3755

38-
# Build distance expressions
56+
cand_ids = [r[0] for r in (await db.execute(cand_stmt)).all()]
57+
58+
# Rerank the retrieved results based on the avg. distance to all search queries
59+
# This drastically improves the quality of the responses with negligible more runtime
3960
distance_exprs = [PaperModel.embedding.cosine_distance(emb) for emb in embeddings]
40-
total_distance = sum(distance_exprs)
41-
avg_distance = total_distance / len(embeddings)
61+
avg_distance = sum(distance_exprs) / len(distance_exprs)
4262

4363
stmt = (
4464
select(PaperModel, avg_distance.label("avg_distance"))
45-
.where(avg_distance < threshold)
65+
.where(avg_distance < threshold, PaperModel.paper_id.in_(cand_ids))
4666
.order_by(avg_distance.asc())
4767
.limit(limit)
4868
)
4969

50-
if search_filter:
51-
clauses = SearchRepository._build_filter_clauses(search_filter)
52-
if clauses:
53-
stmt = stmt.where(and_(*clauses))
70+
rows = (await db.execute(stmt)).all()
5471

55-
result = await db.execute(stmt)
56-
rows = result.fetchall()
5772
return [(paper, float(dist)) for paper, dist in rows]
5873

5974
@staticmethod

backend/requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ transformers==4.51.3
3434
tokenizers==0.21.4
3535
adapters==1.2.0
3636

37+
numpy==1.26.4
3738
pandas>=2.2.0
3839
pyarrow>=22.0.0
3940
pypdf>=4.0.0
4041

4142
# --- PDF to Markdown Conversion ---
42-
docling==2.67.0
43+
docling==2.67.0

0 commit comments

Comments
 (0)