File size: 5,080 Bytes
53d6474
eb09c16
 
cad1126
 
 
87bd002
df7209b
e190921
 
 
df7209b
e190921
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df7209b
e190921
df7209b
e190921
 
df7209b
 
 
5929494
32c1b72
 
1674572
03ba5b4
87bd002
6f8418a
 
dfef0b8
87bd002
6f8418a
eb09c16
a8cd504
acf5da7
32c1b72
2471c01
6f8418a
87bd002
1674572
87bd002
e190921
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e08fbf7
 
e190921
e08fbf7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f8418a
f718f04
e190921
5929494
1674572
 
f718f04
 
 
302d1be
0930360
f718f04
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
156
157
import gradio as gr
from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
import torch
import theme

theme = theme.Theme()


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 langchain_community.llms import HuggingFaceHub

from pydantic import BaseModel
import shutil



custom_title = "<span style='color: rgb(243, 239, 224);'>Green Greta</span>"


# Cell 1: Image Classification Model
image_pipeline = pipeline(task="image-classification", model="guillen/vit-basura-test1")

def predict_image(input_img):
    predictions = image_pipeline(input_img)
    return {p["label"]: p["score"] for p in predictions} 

image_gradio_app = gr.Interface(
    fn=predict_image,
    inputs=gr.Image(label="Image", sources=['upload', 'webcam'], type="pil"),
    outputs=[gr.Label(label="Result")],
    title=custom_title,
    theme=theme
)

# 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_type="mmr")
template = """
Your name is Greta 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 if the question is related with recycling /
No more than two chunks of context /
Answer in the same language of the question /
Always say "thanks for asking!" at the end of the answer /
If the context is not relevant, please answer the question by using your own knowledge about the topic.
        
context: {context}
question: {question}
"""

# Create the chat prompt templates
system_prompt = SystemMessagePromptTemplate.from_template(template)
qa_prompt = ChatPromptTemplate(
	messages=[
		system_prompt,
        MessagesPlaceholder(variable_name="chat_history"), 
		HumanMessagePromptTemplate.from_template("{question}")
    ]
)
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='answer', return_messages=True)

qa_chain = ConversationalRetrievalChain.from_llm(
    llm = llm,
    memory = memory,
    retriever = retriever,
    verbose = True,
    combine_docs_chain_kwargs={'prompt': qa_prompt},
    get_chat_history = lambda h : h,
    rephrase_question = False,
    output_key = 'answer'
)

def chat_interface(question, history):
    # Invoke the QA chain to get the latest answer
    result = qa_chain.invoke({"question": question})
    
    # Access the history stored in the memory
    all_messages = memory.get_all_messages()
    
    # Filter out all but the latest question and answer
    latest_question = None
    latest_answer = None
    for message in all_messages[::-1]:
        if message['output_key'] == 'answer':
            latest_answer = message['output']
        elif message['input_key'] == 'question' and latest_question is None:
            latest_question = message['input']
        if latest_question is not None and latest_answer is not None:
            break
    
    return latest_answer  # Return the answer to the latest question

chatbot_gradio_app = gr.ChatInterface(
    fn=chat_interface,
    title=custom_title
)

# Combine both interfaces into a single app
gr.TabbedInterface(
    [image_gradio_app, chatbot_gradio_app],
    tab_names=["Green Greta Image Classification","Green Greta Chat"],
    theme=theme
).launch()