Skip to content

Commit bfc7460

Browse files
Make multi retriever concurrent
1 parent 9620390 commit bfc7460

1 file changed

Lines changed: 18 additions & 4 deletions

File tree

pyepsilla/utils/search_engine.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import socket
88
import time
99
from typing import Optional, Union
10+
import asyncio
11+
from concurrent.futures import ThreadPoolExecutor, as_completed
1012

1113
class VectorRetriever:
1214
def __init__(
@@ -138,17 +140,29 @@ def set_reranker(self, type: str="rrf", weights: list[float] = None, k = 50, lim
138140
self._reranker = RRFReRanker(weights=weights, k=k, limit=limit)
139141
return self
140142

141-
def search(self, query: str) -> list[dict]:
143+
async def search(self, query: str) -> list[dict]:
142144
# If no retriever is added, return error
143145
if not self._retrievers:
144146
raise Exception("No retriever added to the search engine")
145147
# If more than one retrievers are added, must set a reranker
146148
if len(self._retrievers) > 1 and not self._reranker:
147149
raise Exception("More than one retriever added to the search engine, but no reranker is set")
148-
# Retrieve candidates from each retriever
150+
151+
# Function to wrap synchronous call in async coroutine
152+
def run_retriever(retriever):
153+
return retriever.retrieve(query)
154+
# Use ThreadPoolExecutor to run retrievers concurrently
149155
candidates = []
150-
for retriever in self._retrievers:
151-
candidates.append(retriever.retrieve(query))
156+
with ThreadPoolExecutor(max_workers=len(self._retrievers)) as executor:
157+
# Schedule the execution of each retriever and immediately return future objects
158+
future_to_retriever = {executor.submit(run_retriever, retriever): retriever for retriever in self._retrievers}
159+
160+
for future in as_completed(future_to_retriever):
161+
try:
162+
result = future.result()
163+
candidates.append(result)
164+
except Exception as exc:
165+
print(f'Retriever generated an exception: {exc}')
152166

153167
# Rerank candidates if reranker is set
154168
if self._reranker:

0 commit comments

Comments
 (0)