AWEsumCare-Demo / app.py
ray
factor out index builder from chatbot
693929a
raw
history blame
5.46 kB
import gradio as gr
import openai
import os
from dotenv import load_dotenv
import phoenix as px
import llama_index
from llama_index import Prompt, ServiceContext, VectorStoreIndex, SimpleDirectoryReader
from llama_index.chat_engine.types import ChatMode
from llama_index.llms import ChatMessage, MessageRole
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.text_splitter import SentenceSplitter
from llama_index.extractors import TitleExtractor
from llama_index.ingestion import IngestionPipeline
from chat_template import CHAT_TEXT_QA_PROMPT
from schemas import ChatbotVersion, ServiceProvider
from chatbot import Chatbot, IndexBuilder
from custom_io import UnstructuredReader, default_file_metadata_func
from qdrant import client as qdrantClient
from llama_index import set_global_service_context
from service_provider_config import get_service_provider_config
# initial service setup
px.launch_app()
llama_index.set_global_handler("arize_phoenix")
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
CHUNK_SIZE = 1024
LLM, EMBED_MODEL = get_service_provider_config(
service_provider=ServiceProvider.OPENAI)
service_context = ServiceContext.from_defaults(
chunk_size=CHUNK_SIZE,
llm=LLM,
embed_model=EMBED_MODEL,
)
set_global_service_context(service_context)
class AwesumIndexBuilder(IndexBuilder):
def _load_doucments(self):
dir_reader = SimpleDirectoryReader('./awesumcare_data', file_extractor={
".pdf": UnstructuredReader(),
".docx": UnstructuredReader(),
".pptx": UnstructuredReader(),
},
recursive=True,
exclude=["*.png", "*.pptx"],
file_metadata=default_file_metadata_func)
self.documents = dir_reader.load_data()
print(f"Loaded {len(self.documents)} docs")
def _setup_service_context(self):
super()._setup_service_context()
def _setup_vector_store(self):
self.vector_store = QdrantVectorStore(
client=qdrantClient, collection_name=self.vdb_collection_name)
super()._setup_vector_store()
def _setup_index(self):
super()._setup_index()
if self.is_load_from_vector_store:
self.index = VectorStoreIndex.from_vector_store(self.vector_store)
print("set up index from vector store")
return
pipeline = IngestionPipeline(
transformations=[
SentenceSplitter(),
EMBED_MODEL,
],
vector_store=self.vector_store,
)
pipeline.run(documents=self.documents)
self.index = VectorStoreIndex.from_vector_store(self.vector_store)
class AwesumCareChatbot(Chatbot):
DENIED_ANSWER_PROMPT = ""
SYSTEM_PROMPT = ""
CHAT_EXAMPLES = [
"什麼是安心三寶?",
"點樣立平安紙?"
]
def _setup_observer(self):
pass
def _setup_index(self):
super()._setup_index()
# def _setup_index(self):
# self.index = VectorStoreIndex.from_documents(
# self.documents,
# service_context=self.service_context
# )
# super()._setup_index()
def _setup_query_engine(self):
super()._setup_query_engine()
self.query_engine = self.index.as_query_engine(
text_qa_template=CHAT_TEXT_QA_PROMPT)
def _setup_tools(self):
from llama_index.tools.query_engine import QueryEngineTool
self.tools = QueryEngineTool.from_defaults(
query_engine=self.query_engine)
return super()._setup_tools()
def _setup_chat_engine(self):
# testing #
from llama_index.agent import OpenAIAgent
self.chat_engine = OpenAIAgent.from_tools(
tools=[self.tools],
llm=LLM,
similarity_top_k=1,
verbose=True
)
print("set up agent as chat engine")
# testing #
# self.chat_engine = self.index.as_chat_engine(
# chat_mode=ChatMode.BEST,
# similarity_top_k=5,
# text_qa_template=CHAT_TEXT_QA_PROMPT)
super()._setup_chat_engine()
# gpt-3.5-turbo-1106, gpt-4-1106-preview
awesum_chatbot = AwesumCareChatbot(model_name=ChatbotVersion.CHATGPT_35.value,
index_builder=AwesumIndexBuilder(
vdb_collection_name="demo-v0",
is_load_from_vector_store=True)
)
def vote(data: gr.LikeData):
if data.liked:
gr.Info("You up-voted this response: " + data.value)
else:
gr.Info("You down-voted this response: " + data.value)
chatbot = gr.Chatbot()
with gr.Blocks() as demo:
gr.Markdown("# Awesum Care demo")
with gr.Tab("With awesum care data prepared"):
gr.ChatInterface(
awesum_chatbot.stream_chat,
chatbot=chatbot,
examples=awesum_chatbot.CHAT_EXAMPLES,
)
chatbot.like(vote, None, None)
with gr.Tab("With Initial System Prompt (a.k.a. prompt wrapper)"):
gr.ChatInterface(
awesum_chatbot.predict_with_prompt_wrapper, examples=awesum_chatbot.CHAT_EXAMPLES)
with gr.Tab("Vanilla ChatGPT without modification"):
gr.ChatInterface(awesum_chatbot.predict_vanilla_chatgpt,
examples=awesum_chatbot.CHAT_EXAMPLES)
demo.queue()
demo.launch()