from langchain.docstore.document import Document from llm_call import GeminiLLM from langchain.chains.question_answering import load_qa_chain import chromadb from datetime import datetime import os from langchain_chroma import Chroma from datetime import datetime import pdfkit from langchain.chains.question_answering import load_qa_chain from langchain.prompts import PromptTemplate from pathlib import Path import os from pypdf import PdfReader from llm_call import SermonGeminiPromptTemplate bookQuestion = dict() llm = None embed_model = None retriever = None contemplandoQuestion = { 'DEVOCIONALMENTE':'¿Cómo estimula Dios su corazón a través de Su Palabra?', 'EXÉGESIS':'Cuál es el contexto de este pasaje?', 'CRISTO':'¿Cómo se comprende este texto a la luz de Cristo?', 'ARCO REDENTOR':'¿Cómo encaja este texto en la metanarrativa de las Escrituras?', 'EVANGELION': '¿Cómo se declara el evangelio en este texto?', 'EVANGELION_TWO': '¿Cómo interpretamos este texto a la luz del evangelio?', } proclamandoQuestion = { 'PÚBLICO':'¿Cuáles son los ídolos en los corazones de las personas que rechazarían el evangelio de Cristo?', 'HISTORIA':'¿Cómo el guión de su predicación comunica la historia de Dios?', 'EXPECTATIVAS': '¿Qué espera Dios que hagan como respuesta a esta predicación?', 'EXPECTATIVAS_TWO': '¿Cuáles son sus expectativas divinas como predicador de este mensaje?', } bookQuestion['Contemplando'] = contemplandoQuestion bookQuestion['Proclamando'] = proclamandoQuestion HISTORY_ANSWER = "" DIRECTORY_PATH_TO_DOWNLOAD = 'data/sermon_lab_ai/download_files' if not os.path.exists(DIRECTORY_PATH_TO_DOWNLOAD): os.makedirs(f"{DIRECTORY_PATH_TO_DOWNLOAD}") def getCurrentFileName(): now = datetime.now() strNow = now.strftime("%m%d%Y_%H%M%S") return f"sermonDay_{strNow}.pdf" fileAddresToDownload = f"{DIRECTORY_PATH_TO_DOWNLOAD}{os.sep}{getCurrentFileName()}" FILE_PATH_NAME = fileAddresToDownload def updatePromptTemplate( llmModel, promptTemplate, inputVariablesTemplate ): prompt = PromptTemplate(template = promptTemplate, input_variables = inputVariablesTemplate) if llmModel == None: llmBuilder = GeminiLLM() llmModel = llmBuilder.getLLM() chain = load_qa_chain( llmModel, chain_type = "stuff", prompt = prompt ) return chain def predict(query): templates = SermonGeminiPromptTemplate() chain = updatePromptTemplate( templates.getSermonPromptTemplate('BUILD_PREPARE_QUESTIONS'), ['question','SERMON_CONTEXT','context'] ) if query != '': global retriever answer = askQuestion( query, chain, retriever, topic = query, KEY = 'question' ) answer = (answer.split("<|assistant|>")[-1]).strip() HISTORY_ANSWER = answer return answer else: return query def predictContemplando(queryKey): #Call to LLM LangChaing inference query = contemplandoQuestion[queryKey] return predict(query) def predictProclamando(queryKey): #Call to LLM LangChaing inference query = proclamandoQuestion[queryKey] return predict(query) #### # #### def predictFromInit( sermonTopic, llmModelList = []): global HISTORY_ANSWER keyStr = 'SERMON_TOPIC' templates = SermonGeminiPromptTemplate() llm = llmModelList[0] if len(llmModelList) > 0 else None if HISTORY_ANSWER == '': chain = updatePromptTemplate( llm, templates.getSermonPromptTemplates()['BUILD_INIT'], [keyStr,'CANT_VERSICULOS','context'] ) else: chain = updatePromptTemplate( templates.getSermonPromptTemplates()['BUILD_EMPTY'], ['BIBLE_VERSICLE','context'] ) keyStr = 'BIBLE_VERSICLE' global retriever global embed_model if embed_model == None: llmBuilder = GeminiLLM() embed_model = llmBuilder.getEmbeddingsModel() if retriever == None: doc = Document(page_content="text", metadata={"source": "local"}) vectorstore = Chroma.from_documents( documents=[doc], embedding= embed_model, persist_directory="chroma_db_dir_sermon", # Local mode with in-memory storage only collection_name="sermon_lab_ai" ) retriever = vectorstore.as_retriever( search_kwargs={"k": 3} ) answer = askQuestionInit( '', chain, retriever, topic = sermonTopic, KEY = keyStr ) #Create a new document and build a retriver if answer != '': doc = Document(page_content="text", metadata = {"source": "local"}) vectorstore = Chroma.from_documents( documents=[doc], embedding=embed_model, persist_directory="chroma_db_dir_sermon", # Local mode with in-memory storage only collection_name="sermon_lab_ai" ) retriever = vectorstore.as_retriever( search_kwargs = {"k": 3} ) HISTORY_ANSWER = answer return answer #### # #### def predictQuestionBuild(sermonTopic, llmModelList = []): llm = llmModelList[0] if len(llmModelList) > 0 else None templates = SermonGeminiPromptTemplate() chain = updatePromptTemplate( llm, templates.getSermonPromptTemplates()['BUILD_QUESTION'], ['SERMON_IDEA', 'context'] ) global retriever global embed_model if embed_model == None: llmBuilder = GeminiLLM() embed_model = llmBuilder.getEmbeddingsModel() if retriever == None: doc = Document(page_content="text", metadata={"source": "local"}) vectorstore = Chroma.from_documents( documents = [doc], embedding = embed_model, persist_directory="chroma_db_dir_sermon", # Local mode with in-memory storage only collection_name="sermon_lab_ai" ) retriever = vectorstore.as_retriever( search_kwargs={"k": 3} ) answer = askQuestionEx( '', chain, retriever, topic = sermonTopic, KEY = 'SERMON_IDEA' ) return answer #### # #### def predictDevotionBuild(sermonTopic, llmModelList = []): templates = SermonGeminiPromptTemplate() llm = llmModelList[0] if len(llmModelList) > 0 else None chain = updatePromptTemplate( llm, templates.getSermonPromptTemplate()['BUILD_REFLECTIONS'], ['SERMON_IDEA', 'context'] ) global retriever global HISTORY_ANSWER global embed_model if embed_model == None: llmBuilder = GeminiLLM() embed_model = llmBuilder.getEmbeddingsModel() if retriever == None: doc = Document(page_content="text", metadata={"source": "local"}) vectorstore = Chroma.from_documents( documents=[doc], embedding=embed_model, persist_directory="chroma_db_dir_sermon", # Local mode with in-memory storage only collection_name="sermon_lab_ai" ) retriever = vectorstore.as_retriever( search_kwargs={"k": 3} ) answer = askQuestionEx( HISTORY_ANSWER, chain, retriever, topic = sermonTopic, KEY = 'SERMON_IDEA' ) return answer #### # #### def predictArgumentQuestionBuild(questionAnswer, llmModelList = []): templates = SermonGeminiPromptTemplate() llm = llmModelList[0] if len(llmModelList) > 0 else None chain = updatePromptTemplate( llm, templates.getSermonPromptTemplates()['BUILD_ADD_INFORMATION_TO_QUEST_ANSWER'], ['QUESTION_ANSWER', 'context'] ) global retriever global HISTORY_ANSWER global embed_model if embed_model == None: llmBuilder = GeminiLLM() embed_model = llmBuilder.getEmbeddingsModel() if retriever == None: doc = Document(page_content="text", metadata={"source": "local"}) vectorstore = Chroma.from_documents( documents=[doc], embedding = embed_model, persist_directory="chroma_db_dir_sermon", # Local mode with in-memory storage only collection_name="sermon_lab_ai" ) retriever = vectorstore.as_retriever( search_kwargs={"k": 3} ) answer = askQuestionEx( "", chain, retriever, topic = questionAnswer, KEY = 'QUESTION_ANSWER' ) return answer # A utility function for answer generation def askQuestion( question, _chain, _retriever, topic = 'el amor de Dios', KEY = 'SERMON_TOPIC' ): #Obtener los Chunks relevantes a la pregunta en el RAG #print(f" Question: {question}") context = _retriever.get_relevant_documents(question) #print("---- Contexto ----") #print(context) #print("____________________GLOBAL________") global HISTORY_ANSWER #print (HISTORY_ANSWER) return ( _chain({ KEY: topic, 'SERMON_CONTEXT': HISTORY_ANSWER, "input_documents": context, "question": question }, return_only_outputs = True) )['output_text'] #A utility function for answer generation def askQuestionEx( question, _chain, _retriever, topic = 'el amor de Dios', KEY = 'SERMON_TOPIC' ): context = _retriever.get_relevant_documents(question) global HISTORY_ANSWER return ( _chain({ KEY: topic, "input_documents": context, "question": question }, return_only_outputs=True) )['output_text'] # A utility function for answer generation def askQuestionInit( question, _chain, _retriever, topic = 'el amor de Dios', KEY = 'SERMON_TOPIC' ): #Obtener los Chunks relevantes a la pregunta en el RAG context = _retriever.get_relevant_documents(question) settings = { KEY: topic, "input_documents": context, "question": question } if KEY == 'SERMON_TOPIC': settings['CANT_VERSICULOS'] = 5 return ( _chain( settings, return_only_outputs=True) )['output_text'] def downloadSermonFile(answer): if os.path.exists(FILE_PATH_NAME): os.remove(FILE_PATH_NAME) pdfkit.from_string( answer, FILE_PATH_NAME ) return "" def upload_file_ex(files): file_paths = [file.name for file in files] for filepath in file_paths: name = Path(filepath) file_content = 'Empty content' if os.path.exists(filepath): file_content = '' reader = PdfReader(filepath) for page in reader.pages: file_content += page.extract_text() HISTORY_ANSWER = file_content return [file_paths, file_content]