from llama_index import QueryBundle resp = query_engine.query(QueryBundle(query_str="...", embedding_strs=["...", ...]))
class HybridRetriever(BaseRetriever):
def __init__(self, vector_retriever, bm25_retriever):
self.vector_retriever = vector_retriever
self.bm25_retriever = bm25_retriever
super().__init__()
def _retrieve(self, query, **kwargs):
bm25_nodes = self.bm25_retriever.retrieve(query, **kwargs)
vector_nodes = self.vector_retriever.retrieve(query, **kwargs)
all_nodes = []
node_ids = set()
for n in bm25_nodes + vector_nodes:
if n.node.node_id not in node_ids:
all_nodes.append(n)
node_ids.add(n.node.node_id)
return all_nodes
vector_retriever = index.as_retriever(similarity_top_k=10)
bm25_retriever = BM25Retriever.from_defaults(nodes=nodes, similarity_top_k=10)
vary_question_tmpl = """\
Du bist ein KI-Assistent. Dein Ziel ist es, für eine Frage zu der Leitlinie des Mammakarzinoms,
bis zu {num_queries} Variationen dieser Frage zu erstellen.
Sei kreativ!
Zum Beispiel:
Basisfrage: Sollte man unter der Berücksichtigung einen Gentest machen?
Fragevariationen:
Wann sollte ein Patient unter den Auflagen genetisch Untersucht werden?
Ist eine genetische Laboruntersuchung hierbei notwendig?
Sollte Frau X sich einer genetischen Testung unterziehen um das Riskio besser einschätzen zu können?
Versuchen wir es jetzt!
Basisfrage: {query}
Frage-Variationen:
"""
hybrid_retriever = QueryFusionRetriever(
[vector_retriever, bm25_retriever],
llm=llm,
similarity_top_k=10,
num_queries=4,
mode="reciprocal_rerank",
use_async=True,
verbose=True,
query_gen_prompt=vary_question_tmpl
)