def question_answering(request): try: prompt_template = """You are an extraction AI. Always return only the direct answer as plain text. Do not add any explanation, phrases, or formatting. Example: Q: What is your name? A: David Context: {context} """ # Prepare the prompt messages = [ SystemMessagePromptTemplate.from_template(prompt_template), HumanMessagePromptTemplate.from_template(request['question']) ] qa_prompt = ChatPromptTemplate.from_messages(messages) # Build the retriever retriever = build_retriever(request['file_id']) # Fetch relevant documents relevant_docs = retriever.get_relevant_documents(request['question']) # print(f"Relevant docs: {relevant_docs}") # Compress results for final retrieval using Cohere reranker compressor = CohereRerank(model="rerank-english-v3.0", top_n=8) compression_retriever = ContextualCompressionRetriever( base_compressor=compressor, base_retriever=retriever ) # Build the QA chain qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=compression_retriever, return_source_documents=True, chain_type_kwargs={"prompt": qa_prompt} ) # Get the answer response = qa_chain.invoke({"query": request['question']}) if response.get('source_documents'): most_relevant_document = response['source_documents'][0].metadata.get('source', 'Unknown') result = { "statusCode": 200, "body": { # "reference": most_relevant_document, "answer": response['result'], "status": "success", "file_id": response['source_documents'][0].metadata.get('file_id', 'Unknown') } } else: result = { "statusCode": 200, "body": { "answer": "No relevant information found." } } return result except Exception as e: print("Error in question_answering:", e) return { "statusCode": 500, "body": { "message": "An error occurred while processing your request.", "error": str(e) } }