import gradio as gr from huggingface_hub import InferenceClient ## Import required packages from langchain_community.llms import CTransformers from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate, FewShotPromptTemplate import gradio as gr from langchain.chains import LLMChain from langchain.prompts import PromptTemplate # from langchain.document_loaders import WikipediaLoader from langchain_community.document_loaders import JSONLoader from langchain.text_splitter import CharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma from operator import itemgetter from langchain_core.output_parsers import JsonOutputParser from langchain_core.outputs import Generation from typing import Any, List, Optional, Type, TypeVar, Union ## Defining few variables MODEL_PATH = "TheBloke/Mistral-7B-Claude-Chat-GGUF" MODEL_FILE = "mistral-7b-claude-chat.Q4_K_M.gguf" MODEL_TYPE = "mistral" MAX_NEW_TOKENS = 100 temperature = 1 top_p = 0.95 top_k = 50 repetition_penalty = 1.5 ## Defining Model llm = CTransformers( model = MODEL_PATH, model_file=MODEL_FILE, model_type = MODEL_TYPE, config = { "max_new_tokens":MAX_NEW_TOKENS, "temperature": temperature, "top_p": top_p, "top_k": top_k, "repetition_penalty": repetition_penalty, "last_n_tokens": 4, "stream": True, "gpu_layers": 0 } ) # One shot inferencing examples = [ { "query": "Please classify this name: Ketan Jogadankar", "answer":"""{ "name": "Ketan Jogadankar", "label": "person", "score": 0.99, "reason": "Ketan is a most famous first name and Jogadankar looks like a surname." }""" } ] example_template = """ User: {query} {answer} """ example_prompt = ChatPromptTemplate.from_messages( [("human", "{query}"), ("ai", "{answer}")] ) prefix = """Act as an AI assistant that classifies names into 3 categories (person, business and other) based on the provided rules and example data. {format_instructions} Do not append any text to human input. Rules: * If the names contains the word "POD", classify it as a other. * If the names contains the word "trust", classify it as a other. * If the names contains the word "llc", classify it as a business. * If the name is non-profit organization then classify it as a other. Here are some examples: """ suffix = """Please classify this name: {name} """ few_shot_prompt_template = FewShotChatMessagePromptTemplate( examples = examples, example_prompt = example_prompt ) prompt = ChatPromptTemplate.from_messages( [ ("system",prefix), few_shot_prompt_template, ("human", suffix) ] ) format_instructions = """The output should be formatted as a JSON instance that conforms to the JSON schema below. Here is the output schema: ``` {"properties": {"name": {"title": "Name", "description": "this is the input name passed by human", "type": "string"}, "label": {"title": "Label", "description": "this is the label predicted for input name", "type": "string"}, "score": {"title": "Score", "description": "This is confidence score for predicted label", "type": "number"}, "reason": {"title": "Reason", "description": "This is to explain why AI has predicted that label", "type": "string"}}, "required": ["name", "label", "score", "reason"]} ``` """ # RAG data_loader = JSONLoader(file_path="document.json", jq_schema='.',text_content=False) data = data_loader.load() data = [doc.page_content for doc in data] splitter = CharacterTextSplitter(chunk_size=2, chunk_overlap=1) documents = splitter.create_documents(texts=data) docs_str = [doc.page_content for doc in documents] sentence_emb = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") db = Chroma.from_texts(docs_str, sentence_emb, persist_directory="./temp_db") db.persist() retriever = db.as_retriever( search_type="similarity", search_kwargs={'k':1}) # Pydantic output validator from pydantic import BaseModel, Field class NameClassification(BaseModel): name:str = Field(description="this is the input name passed by human") label:str = Field(description="this is the label predicted for input name") score:float = Field(description="This is confidence score for predicted label") reason:str = Field(description="This is to explain why AI has predicted that label") def remove_junks(self, text): start_index = text.index("{") stop_index = text.index("}") + 1 return text[start_index:stop_index+1] def parse(self, text): text = self.remove_junks(text) super().invoke(text) class CustomParser(JsonOutputParser): def parse_result(self, result: List[Generation], *, partial: bool = False) -> Any: text = result[0].text text = text.strip() text = self.remove_junks(text) result = [Generation(text= text)] return super().parse_result(result=result,partial=partial) def remove_junks(self, text): start_index = text.index("{") stop_index = text.index("}") + 1 return text[start_index:stop_index+1] parser = CustomParser(pydantic_object=NameClassification) chain = ( {"context": itemgetter("name") | retriever, "format_instructions": itemgetter("format_instructions"), "name": itemgetter("name")} | prompt | llm | parser ) """ For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference """ # client = InferenceClient("HuggingFaceH4/zephyr-7b-beta") def predict(message, history, min_hist_memo = 3): streamer = None while streamer == None: try: streamer = chain.invoke({"name":message, "format_instructions":format_instructions}) except: pass yield str(streamer) gr.ChatInterface(predict, title="Mistral 7B").queue().launch(debug=True) # def respond( # message, # history: list[tuple[str, str]], # system_message, # max_tokens, # temperature, # top_p, # ): # messages = [{"role": "system", "content": system_message}] # for val in history: # if val[0]: # messages.append({"role": "user", "content": val[0]}) # if val[1]: # messages.append({"role": "assistant", "content": val[1]}) # messages.append({"role": "user", "content": message}) # response = "" # for message in client.chat_completion( # messages, # max_tokens=max_tokens, # stream=True, # temperature=temperature, # top_p=top_p, # ): # token = message.choices[0].delta.content # response += token # yield response # """ # For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface # """ # demo = gr.ChatInterface( # respond, # additional_inputs=[ # gr.Textbox(value="You are a friendly Chatbot.", label="System message"), # gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"), # gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"), # gr.Slider( # minimum=0.1, # maximum=1.0, # value=0.95, # step=0.05, # label="Top-p (nucleus sampling)", # ), # ], # ) # if __name__ == "__main__": # demo.launch()