Skip to content

Commit a7f1491

Browse files
authored
Merge pull request #34 from mafzaal/dev
refactor: Update document loading URL handling and improve vector sto…
2 parents d29fdb5 + c20ad0a commit a7f1491

4 files changed

Lines changed: 57 additions & 9 deletions

File tree

backend/lets_talk/core/pipeline/processors.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ def process_documents_full(
358358
self.logger.debug(f"Added checksum metadata to {len(documents)} documents")
359359

360360
# Step 3: Split documents
361-
if not self.use_chunking:
361+
if self.use_chunking:
362362
self.logger.info("Step 3: Splitting documents into chunks")
363363
split_docs = self.chunking_service.split_documents(documents)
364364
self.logger.info(f"Split {len(documents)} documents into {len(split_docs)} chunks")

backend/lets_talk/core/pipeline/services/document_loader.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,13 @@ def _update_document_metadata(self, doc: Document) -> None:
137137
doc: Document to update
138138
"""
139139
# Create URL from source path
140-
url = doc.metadata["source"].replace(self.data_dir, self.blog_base_url)
140+
141+
# remove trailing slash from blog_base_url
142+
blog_base_url = self.blog_base_url
143+
if blog_base_url.endswith('/'):
144+
blog_base_url = blog_base_url[:-1]
145+
146+
url = doc.metadata["source"].replace(self.data_dir, blog_base_url)
141147

142148
# Remove index.md suffix if present
143149
if url.endswith(self.data_dir_pattern):

backend/lets_talk/core/rag/retriever.py

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from typing import List, Optional
44
from langchain.schema.document import Document
55
from langchain_qdrant import QdrantVectorStore
6+
from qdrant_client import QdrantClient
7+
from qdrant_client.models import Distance, VectorParams
68
from langchain_community.document_loaders import WebBaseLoader
79
from langchain.chat_models import init_chat_model
810
from langchain_core.vectorstores.base import VectorStoreRetriever
@@ -59,7 +61,7 @@ def load_vector_store(
5961
qdrant_url: str = QDRANT_URL,
6062
embedding_model_name: str = EMBEDDING_MODEL
6163
) -> Optional[QdrantVectorStore]:
62-
"""Load the vector store from the specified collection."""
64+
"""Load the vector store from the specified collection, creating it if it doesn't exist."""
6365
logger.info("Loading vector store: collection=%s, url=%s, embedding_model=%s",
6466
collection_name, qdrant_url, embedding_model_name)
6567

@@ -68,20 +70,61 @@ def load_vector_store(
6870
return None
6971

7072
embeddings = init_embeddings_wrapper(embedding_model_name)
71-
7273

7374
try:
75+
# First, try to connect to existing collection
7476
vector_store = QdrantVectorStore.from_existing_collection(
7577
embedding=embeddings,# type: ignore
7678
collection_name=collection_name,
7779
url=qdrant_url,
7880
prefer_grpc=True,
7981
)
80-
logger.info("Vector store loaded successfully")
82+
logger.info("Vector store loaded successfully from existing collection")
8183
return vector_store
8284
except Exception as e:
83-
logger.error(f"Failed to load vector store: {e}")
84-
return None
85+
logger.warning(f"Failed to load existing collection '{collection_name}': {e}")
86+
logger.info("Attempting to create new collection...")
87+
88+
try:
89+
# Create a Qdrant client to check/create collection
90+
client = QdrantClient(url=qdrant_url, prefer_grpc=True)
91+
92+
# Check if collection exists
93+
collections = client.get_collections()
94+
collection_exists = any(col.name == collection_name for col in collections.collections)
95+
96+
if not collection_exists:
97+
logger.info(f"Collection '{collection_name}' does not exist. Creating it...")
98+
99+
# Get embedding dimension from the embeddings model
100+
sample_embedding = embeddings.embed_query("sample text")
101+
vector_size = len(sample_embedding)
102+
103+
# Create collection with vector parameters
104+
client.create_collection(
105+
collection_name=collection_name,
106+
vectors_config=VectorParams(
107+
size=vector_size,
108+
distance=Distance.COSINE
109+
)
110+
)
111+
logger.info(f"Collection '{collection_name}' created successfully with vector size {vector_size}")
112+
else:
113+
logger.info(f"Collection '{collection_name}' already exists")
114+
115+
# Now create vector store from the collection (existing or newly created)
116+
vector_store = QdrantVectorStore.from_existing_collection(
117+
embedding=embeddings,# type: ignore
118+
collection_name=collection_name,
119+
url=qdrant_url,
120+
prefer_grpc=True,
121+
)
122+
logger.info("Vector store loaded successfully after collection creation/verification")
123+
return vector_store
124+
125+
except Exception as create_error:
126+
logger.error(f"Failed to create/load collection '{collection_name}': {create_error}")
127+
return None
85128

86129

87130
def build_retriever(

docker-compose.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@ services:
4646
timeout: 5s
4747
retries: 5
4848
langgraph-api:
49-
image: ghcr.io/mafzaal/lets-talk:main #the_data_guy_chat
50-
# Remove direct port exposure - access only through nginx
49+
image: lets-talk #ghcr.io/mafzaal/lets-talk:main
5150
ports:
5251
- "8124:8000"
5352
depends_on:

0 commit comments

Comments
 (0)