Spaces:
Runtime error
Runtime error
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() |