Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -14,10 +14,12 @@ from fastapi.responses import JSONResponse
|
|
| 14 |
# Make sure you have these files in a 'utils' folder
|
| 15 |
from utils.DocsLoader import load_and_chunk
|
| 16 |
from utils.Schemas import RunRequest, RunResponse
|
| 17 |
-
|
|
|
|
|
|
|
| 18 |
from langchain_google_genai import ChatGoogleGenerativeAI
|
| 19 |
from langchain_huggingface import HuggingFaceEmbeddings # Correct new import
|
| 20 |
-
from langchain_chroma import Chroma
|
| 21 |
from langchain_community.retrievers import BM25Retriever
|
| 22 |
from langchain.retrievers import EnsembleRetriever, ContextualCompressionRetriever
|
| 23 |
from langchain.retrievers.document_compressors import CrossEncoderReranker
|
|
@@ -145,10 +147,37 @@ async def run_hackrx(req: RunRequest):
|
|
| 145 |
if not chunks:
|
| 146 |
return JSONResponse({"error": "No documents could be processed."}, status_code=400)
|
| 147 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
# Create retrievers using the pre-loaded models from our ml_models dictionary
|
| 149 |
keyword_retriever = BM25Retriever.from_documents(chunks)
|
| 150 |
-
|
| 151 |
-
|
|
|
|
| 152 |
|
| 153 |
compression_retriever = ContextualCompressionRetriever(
|
| 154 |
base_retriever=ensemble_retriever, base_compressor=ml_models["reranker_compressor"]
|
|
|
|
| 14 |
# Make sure you have these files in a 'utils' folder
|
| 15 |
from utils.DocsLoader import load_and_chunk
|
| 16 |
from utils.Schemas import RunRequest, RunResponse
|
| 17 |
+
from concurrent.futures import ThreadPoolExecutor
|
| 18 |
+
from langchain.vectorstores import FAISS
|
| 19 |
+
from langchain.schema import Document
|
| 20 |
from langchain_google_genai import ChatGoogleGenerativeAI
|
| 21 |
from langchain_huggingface import HuggingFaceEmbeddings # Correct new import
|
| 22 |
+
# from langchain_chroma import Chroma
|
| 23 |
from langchain_community.retrievers import BM25Retriever
|
| 24 |
from langchain.retrievers import EnsembleRetriever, ContextualCompressionRetriever
|
| 25 |
from langchain.retrievers.document_compressors import CrossEncoderReranker
|
|
|
|
| 147 |
if not chunks:
|
| 148 |
return JSONResponse({"error": "No documents could be processed."}, status_code=400)
|
| 149 |
|
| 150 |
+
|
| 151 |
+
####code for parallel####################################################################################
|
| 152 |
+
|
| 153 |
+
|
| 154 |
+
docs = [Document(page_content=d.page_content) for d in chunks]
|
| 155 |
+
|
| 156 |
+
# Parallel embedding
|
| 157 |
+
def embed_batch(batch):
|
| 158 |
+
texts = [d.page_content for d in batch]
|
| 159 |
+
embs = ml_models['embedder'].embed_documents(texts)
|
| 160 |
+
for doc, emb in zip(batch, embs):
|
| 161 |
+
doc.embedding = emb
|
| 162 |
+
return batch
|
| 163 |
+
|
| 164 |
+
# Batch and run
|
| 165 |
+
batch_size = 64
|
| 166 |
+
batches = [docs[i:i+batch_size] for i in range(0, len(docs), batch_size)]
|
| 167 |
+
embedded_docs = []
|
| 168 |
+
with ThreadPoolExecutor() as executor:
|
| 169 |
+
for batch in executor.map(embed_batch, batches):
|
| 170 |
+
embedded_docs.extend(batch)
|
| 171 |
+
|
| 172 |
+
vectorstore = FAISS.from_documents(embedded_docs, embedding=None)
|
| 173 |
+
dense_retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
|
| 174 |
+
|
| 175 |
+
|
| 176 |
# Create retrievers using the pre-loaded models from our ml_models dictionary
|
| 177 |
keyword_retriever = BM25Retriever.from_documents(chunks)
|
| 178 |
+
keyword_retriever.k = 4
|
| 179 |
+
# dense_retriever = Chroma.from_documents(documents=chunks, embedding=ml_models["embedder"]).as_retriever()
|
| 180 |
+
ensemble_retriever = EnsembleRetriever(retrievers=[keyword_retriever, dense_retriever], weights=[0.4, 0.65])
|
| 181 |
|
| 182 |
compression_retriever = ContextualCompressionRetriever(
|
| 183 |
base_retriever=ensemble_retriever, base_compressor=ml_models["reranker_compressor"]
|