from click import prompt from langchain_core.runnables import RunnableParallel from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser from streamlit import text_input from langchain_community.vectorstores import FAISS from langchain_ollama import OllamaEmbeddings from langchain_ollama import ChatOllama from langchain_core.prompts import PromptTemplate from ollama import chat from langchain_core.runnables import RunnableParallel #### ************************************************************************************SQL*********************************************************************************** def sql_text(text_input): embedding = OllamaEmbeddings(model="nomic-embed-text") vector_store = FAISS.load_local( "faiss_index", embedding, allow_dangerous_deserialization=True ) retriever = vector_store.as_retriever(search_type="similarity", search_kwargs={"k": 1}) llm = ChatOllama( model="llama3.2", temperature=0 ) prompt = PromptTemplate( template=""" You are an SQL assistant. Use ONLY the provided context. Rules: 1. If the SQL query exists in the context, return ONLY that SQL query. 2. Do not explain. 3. Do not rewrite the question. 4. Do not generate a new query. 5. If the SQL query is missing, reply exactly: I don't know. Context: {context} Question: {question} SQL: """, input_variables=["context", "question"], ) parallel_chain = RunnableParallel({ 'context': retriever , 'question': RunnablePassthrough() }) parser = StrOutputParser() main_chain = parallel_chain | prompt | llm | parser response = main_chain.invoke(text_input) return response # def image_input( image_path): # system_prompt = """ # Act as an expert OCR and data extraction assistant. # Please format your response clearly using the following headings: # ### User Statement # Extract the introductory text written by the user at the very top of the image. # ### Question Description # Extract the problem statement from the left-hand panel under the Description tab. # ### SQL Query # Extract the exact SQL code written inside the dark-themed code editor on the right. # ### Error Message # Extract the red error message displayed at the bottom right. # """ # response = chat( # model="qwen2.5vl:7b", # messages=[ # { # "role": "system", # "content": system_prompt # }, # { # "role": "user", # "content": "Extract all requested information from this image.", # "images": ["sql_eorror.png"] # } # ] # ) # response_image_test =response.message.content # llm = ChatOllama( # model="llama3.2", # temperature=0 # ) # embedding = OllamaEmbeddings(model="nomic-embed-text") # vector_store = FAISS.load_local( # "faiss_index", # embedding, # allow_dangerous_deserialization=True # ) # retriever = vector_store.as_retriever( # search_type="similarity", # search_kwargs={"k": 1} # ) # prompt = PromptTemplate( # template=""" # You are an SQL assistant. # Use ONLY the provided context. # Rules: # 1. If the SQL query exists in the context, return ONLY that SQL query. # 2. Do not explain. # 3. Do not rewrite the question. # 4. Do not generate a new query. # 5. If the SQL query is missing, reply exactly: # I don't know. # Context: # {context} # Question: # {question} # SQL: # """, # input_variables=["context", "question"], # ) # parallel_chain = RunnableParallel({ # 'context': retriever , # 'question': RunnablePassthrough() # }) # parser = StrOutputParser() # main_chain = parallel_chain | prompt | llm | parser # response = main_chain.invoke(response_image_test) # return response def sql_image(image_path): # -------------------------------------------------- # STEP 1 : Extract ONLY the SQL question # -------------------------------------------------- system_prompt = """ You are an OCR assistant. Your job is to read the screenshot and extract ONLY the SQL problem statement. Rules: - Ignore the SQL editor. - Ignore the error message. - Ignore buttons. - Ignore the database output. - Ignore everything except the Question Description. Return ONLY the question text. Do not add headings. Do not explain anything. """ response = chat( model="qwen2.5vl:7b", messages=[ { "role": "system", "content": system_prompt }, { "role": "user", "content": "Extract only the SQL question.", "images": [image_path] } ] ) extracted_question = response.message.content.strip() print("\nExtracted Question:\n") print(extracted_question) # -------------------------------------------------- # STEP 2 : Load LLM # -------------------------------------------------- llm = ChatOllama( model="llama3.2", temperature=0 ) # -------------------------------------------------- # STEP 3 : Load Embeddings # -------------------------------------------------- embedding = OllamaEmbeddings( model="nomic-embed-text" ) vector_store = FAISS.load_local( "faiss_index", embedding, allow_dangerous_deserialization=True ) retriever = vector_store.as_retriever( search_type="similarity", search_kwargs={"k":3} ) # -------------------------------------------------- # STEP 4 : Prompt # -------------------------------------------------- prompt = PromptTemplate( template=""" You are an SQL assistant. Use ONLY the retrieved context. Rules: 1. Return ONLY the SQL query. 2. No explanation. 3. No markdown. 4. Do not rewrite the question. 5. If the answer is not present in the context, reply exactly: I don't know. Context: {context} Question: {question} SQL: """, input_variables=["context", "question"], ) # -------------------------------------------------- # STEP 5 : Chain # -------------------------------------------------- parallel_chain = RunnableParallel( { "context": retriever, "question": RunnablePassthrough() } ) parser = StrOutputParser() main_chain = ( parallel_chain | prompt | llm | parser ) # -------------------------------------------------- # STEP 6 : Retrieve using ONLY the extracted question # -------------------------------------------------- response = main_chain.invoke(extracted_question) return response def sql_text_image(question, image_path): # -------------------------------------------------- # STEP 1 : Extract ONLY the SQL question from the image # -------------------------------------------------- sql_answer1 = sql_image(image_path) sql_answer2 = sql_text(question) # -------------------------------------------------- # STEP 2 : Combine the extracted question and the text input # -------------------------------------------------- # Build the Parallel Chain prompt = f""" You are an SQL expert. Image SQL: {sql_answer1} User Question: {sql_answer2} Use BOTH pieces of information to produce the final SQL answer. Output exactly in this format: Kindly go through the provided information. -> By Prince Kushwaha Do not include any explanation or markdown. Replace with the actual SQL answer. """ llm = ChatOllama( model="llama3.2", temperature=0 ) response = llm.invoke(prompt) return response.content ### *************************************************************************Excel************************************************************************** def excel_text(question): # Load LLM llm = ChatOllama( model="llama3.2", temperature=0 ) # Prompt prompt = PromptTemplate( template=""" You are an Excel expert. Answer the following Excel question. Rules: 1. Return only the final answer. 2. If the answer is an Excel formula, return only the formula. 3. Do not use markdown. 4. Keep the answer concise. Question: {question} Answer: """, input_variables=["question"], ) # Output Parser parser = StrOutputParser() # Chain main_chain = prompt | llm | parser # Generate Response response = main_chain.invoke({ "question": text_input }) return response.content.strip() def excel_image(image_path): # -------------------------------------------------- # STEP 1 : Extract ONLY the Excel question # -------------------------------------------------- system_prompt = """ You are an OCR assistant. Your task is to read the screenshot and extract ONLY the Excel question. Rules: - Ignore the Excel ribbon. - Ignore row and column headers. - Ignore formulas already written. - Ignore buttons and menus. - Ignore answer choices if not part of the question. - Return ONLY the question text. Do not explain anything. Do not add headings. """ response = chat( model="qwen2.5vl:7b", messages=[ { "role": "system", "content": system_prompt }, { "role": "user", "content": "Extract only the Excel question.", "images": [image_path] } ] ) extracted_question = response.message.content.strip() print("\nExtracted Question:\n") print(extracted_question) # -------------------------------------------------- # STEP 2 : Load LLM # -------------------------------------------------- llm = ChatOllama( model="llama3.2", temperature=0 ) # -------------------------------------------------- # STEP 3 : Prompt # -------------------------------------------------- prompt = PromptTemplate( template=""" You are an Excel expert. Answer the following Excel question. Rules: 1. Provide the correct answer only. 2. If a formula is required, return only the formula. 3. If an explanation is required, keep it concise. 4. Do not use markdown. Question: {question} Answer: """, input_variables=["question"], ) parser = StrOutputParser() chain = prompt | llm | parser # -------------------------------------------------- # STEP 4 : Generate Answer # -------------------------------------------------- answer = chain.invoke({ "question": extracted_question }) return answer def excel_text_image(question, image_path): """ question : Extracted text from OCR image_path : Path to the Excel screenshot (optional, not used here) """ # Load LLM llm = ChatOllama( model="llama3.2", temperature=0 ) # Prompt prompt = PromptTemplate( template=""" You are an Excel expert. Answer the following Excel question. Rules: 1. Return only the final answer. 2. If the answer is an Excel formula, return only the formula. 3. If the question asks for a value, return only the value. 4. If an explanation is needed, keep it brief. 5. Do not use markdown. Question: {question} Answer: """, input_variables=["question"], ) parser = StrOutputParser() # Chain chain = prompt | llm | parser # Generate answer response = chain.invoke({ "question": question }) return response