classDenseXRetrievalPack(BaseLlamaPack):def__init__(self,documents:List[Document],proposition_llm:Optional[LLM]=None,query_llm:Optional[LLM]=None,embed_model:Optional[BaseEmbedding]=None,text_splitter:TextSplitter=SentenceSplitter(),similarity_top_k:int=4,streaming:bool=False,)->None:"""Init params."""self._proposition_llm=proposition_llmorOpenAI(model="gpt-3.5-turbo",temperature=0.1,max_tokens=750,)Settings.embed_model=embed_modelorOpenAIEmbedding(embed_batch_size=128)Settings.llm=query_llmorOpenAI()Settings.num_output=self._proposition_llm.metadata.num_outputnodes=text_splitter.get_nodes_from_documents(documents)sub_nodes=self._gen_propositions(nodes)all_nodes=nodes+sub_nodesall_nodes_dict={n.node_id:nforninall_nodes}self.vector_index=VectorStoreIndex(all_nodes,show_progress=True)self.retriever=RecursiveRetriever("vector",retriever_dict={"vector":self.vector_index.as_retriever(similarity_top_k=similarity_top_k)},node_dict=all_nodes_dict,)self.query_engine=RetrieverQueryEngine.from_args(self.retriever,streaming=streaming)asyncdef_aget_proposition(self,node:TextNode)->List[TextNode]:"""Get proposition."""inital_output=awaitself._proposition_llm.apredict(PROPOSITIONS_PROMPT,node_text=node.text)outputs=inital_output.split("\n")all_propositions=[]foroutputinoutputs:ifnotoutput.strip():continueifnotoutput.strip().endswith("]"):ifnotoutput.strip().endswith('"')andnotoutput.strip().endswith(","):output=output+'"'output=output+" ]"ifnotoutput.strip().startswith("["):ifnotoutput.strip().startswith('"'):output='"'+outputoutput="[ "+outputtry:propositions=json.loads(output)exceptException:# fallback to yamltry:propositions=yaml.safe_load(output)exceptException:# fallback to next outputcontinueifnotisinstance(propositions,list):continueall_propositions.extend(propositions)assertisinstance(all_propositions,list)nodes=[TextNode(text=prop)forpropinall_propositionsifprop]return[IndexNode.from_text_node(n,node.node_id)forninnodes]def_gen_propositions(self,nodes:List[TextNode])->List[TextNode]:"""Get propositions."""sub_nodes=asyncio.run(run_jobs([self._aget_proposition(node)fornodeinnodes],show_progress=True,workers=8,))# Flatten listreturn[nodeforsub_nodeinsub_nodesfornodeinsub_node]defget_modules(self)->Dict[str,Any]:"""Get modules."""return{"query_engine":self.query_engine,"retriever":self.retriever,}defrun(self,query_str:str,**kwargs:Any)->RESPONSE_TYPE:"""Run the pipeline."""returnself.query_engine.query(query_str)