File size: 5,326 Bytes
3fde113
 
 
 
9aab6a2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
030bcf4
9aab6a2
4083e28
 
9aab6a2
 
 
 
 
3fde113
4083e28
3fde113
 
 
 
 
 
 
57d1004
3fde113
57d1004
3fde113
 
 
9aab6a2
82f5dd5
9aab6a2
 
ed4a174
57d1004
 
ed4a174
 
9aab6a2
 
0cece18
9aab6a2
 
 
 
 
 
 
 
 
 
 
c630f6a
76e8490
4083e28
f87fc7c
4083e28
 
 
 
 
 
f87fc7c
 
 
4083e28
 
f87fc7c
4083e28
3bf57af
9aab6a2
 
4083e28
9aab6a2
4083e28
 
 
f87fc7c
4083e28
de3ab4f
9aab6a2
de3ab4f
 
 
6392ddf
de3ab4f
 
 
 
3fde113
9aab6a2
f87fc7c
9aab6a2
 
 
4083e28
9aab6a2
 
76e8490
9aab6a2
76e8490
4083e28
 
9aab6a2
 
f87fc7c
 
4083e28
 
 
 
 
 
 
 
 
 
14138ac
4083e28
 
 
 
f41a82a
33a475f
 
 
f41a82a
3fde113
 
f41a82a
3fde113
 
f41a82a
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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 questions 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: {question}
{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='question', 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,history):
    result = qa_chain.invoke({'question': question})
    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()