import gradio as gr from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer import torch import os import sys sys.path.append('../..') #langchain from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.prompts import PromptTemplate from langchain.chains import RetrievalQA from langchain.prompts import ChatPromptTemplate from langchain.schema import StrOutputParser from langchain.schema.runnable import Runnable from langchain.schema.runnable.config import RunnableConfig from langchain.chains import ( LLMChain, ConversationalRetrievalChain) from langchain.vectorstores import Chroma from langchain.memory import ConversationBufferMemory from langchain.chains import LLMChain from langchain.prompts.prompt import PromptTemplate from langchain.prompts.chat import ChatPromptTemplate, SystemMessagePromptTemplate from langchain.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate, MessagesPlaceholder from langchain.document_loaders import PyPDFDirectoryLoader from pydantic import BaseModel, Field from langchain.output_parsers import PydanticOutputParser from langchain_community.llms import HuggingFaceHub from pydantic import BaseModel import shutil # Cell 1: Image Classification Model image_pipeline = pipeline(task="image-classification", model="microsoft/resnet-50") def predict_image(input_img): predictions = image_pipeline(input_img) return input_img, {p["label"]: p["score"] for p in predictions} image_gradio_app = gr.Interface( fn=predict_image, inputs=gr.Image(label="Select waste candidate", sources=['upload', 'webcam'], type="pil"), outputs=[gr.Image(label="Processed Image"), gr.Label(label="Result", num_top_classes=2)], title="What kind of waste do you have?", ) # Cell 2: Chatbot Model loader = PyPDFDirectoryLoader('pdfs') data=loader.load() # split documents text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=70, length_function=len ) docs = text_splitter.split_documents(data) # define embedding embeddings = HuggingFaceEmbeddings(model_name='thenlper/gte-small') # create vector database from data persist_directory = 'docs/chroma/' # Remove old database files if any shutil.rmtree(persist_directory, ignore_errors=True) vectordb = Chroma.from_documents( documents=docs, embedding=embeddings, persist_directory=persist_directory ) # define retriever retriever = vectordb.as_retriever(search_kwargs={"k": 1}, search_type="mmr") class FinalAnswer(BaseModel): question: str = Field(description="the original question") answer: str = Field(description="the extracted answer") # Assuming you have a parser for the FinalAnswer class parser = PydanticOutputParser(pydantic_object=FinalAnswer) template = """ Your name is AngryGreta and you are a recycling chatbot with the objective to anwer querys from user in English or Spanish / Use the following pieces of context to answer the question / Answer in the same language of the question / Context: {context} Chat history: {chat_history} User: {query} {format_instructions} """ # Create the chat prompt templates sys_prompt = SystemMessagePromptTemplate.from_template(template) qa_prompt = ChatPromptTemplate( messages=[ sys_prompt, MessagesPlaceholder(variable_name="chat_history"), HumanMessagePromptTemplate.from_template("{question}")], partial_variables={"format_instructions": parser.get_format_instructions()} ) llm = HuggingFaceHub( repo_id="mistralai/Mixtral-8x7B-Instruct-v0.1", task="text-generation", model_kwargs={ "max_new_tokens": 1024, "top_k": 30, "temperature": 0.1, "repetition_penalty": 1.03, }, ) memory = ConversationBufferMemory(llm=llm, memory_key="chat_history", input_key='query', output_key='output', return_messages=True) qa_chain = ConversationalRetrievalChain.from_llm( llm = llm, condense_question_prompt = qa_prompt, memory = memory, retriever = retriever, verbose = True, combine_docs_chain_kwargs={'prompt': qa_prompt}, get_chat_history = lambda h : h, rephrase_question = True, output_key = 'output', ) def chat_interface(question): result = qa_chain.invoke({'query': question, 'context': retriever}) output_string = result['output'] # Find the index of the last occurrence of "answer": in the string answer_index = output_string.rfind('"answer":') # Extract the substring starting from the "answer": index answer_part = output_string[answer_index + len('"answer":'):].strip() # Find the next occurrence of a double quote to get the start of the answer value quote_index = answer_part.find('"') # Extract the answer value between double quotes answer_value = answer_part[quote_index + 1:answer_part.find('"', quote_index + 1)] return answer_value chatbot_gradio_app = gr.ChatInterface( fn=chat_interface, title='Our doubts are traitors, And make us lose the good we oft might win, By fearing to attempt.' ) # Combine both interfaces into a single app app=gr.TabbedInterface( [image_gradio_app, chatbot_gradio_app], tab_names=["image","chatbot"] ) app.queue() app.launch()