Spaces:
Runtime error
Runtime error
| import glob | |
| import gradio as gr | |
| import openai | |
| import os | |
| from dotenv import load_dotenv | |
| import phoenix as px | |
| import llama_index | |
| from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings | |
| from llama_index.core.chat_engine.types import ChatMode | |
| from llama_index.core.llms import ChatMessage, MessageRole | |
| from llama_index.core.node_parser import SentenceSplitter | |
| from llama_index.core.extractors import TitleExtractor | |
| from llama_index.core.ingestion import IngestionPipeline | |
| from llama_index.vector_stores.qdrant import QdrantVectorStore | |
| from llama_index.llms.ollama import Ollama | |
| from chat_template import CHAT_TEXT_QA_PROMPT, TEXT_QA_SYSTEM_PROMPT | |
| from schemas import ChatbotVersion, ServiceProvider | |
| from chatbot import Chatbot, IndexBuilder | |
| from custom_io import MarkdownReader, UnstructuredReader, default_file_metadata_func | |
| from qdrant import client as qdrantClient | |
| from llama_index.core import set_global_service_context | |
| from service_provider_config import get_service_provider_config | |
| load_dotenv() | |
| # initial service setup | |
| px.launch_app() | |
| llama_index.core.set_global_handler("arize_phoenix") | |
| # llama_index.set_global_handler("wandb", run_args={"project": "llamaindex"}) | |
| openai.api_key = os.getenv("OPENAI_API_KEY") | |
| IS_LOAD_FROM_VECTOR_STORE = True | |
| VDB_COLLECTION_NAME = "demo-v9" | |
| MODEL_NAME = ChatbotVersion.CHATGPT_4O.value | |
| CHUNK_SIZE = 8191 | |
| LLM, EMBED_MODEL = get_service_provider_config( | |
| service_provider=ServiceProvider.AZURE, model_name=MODEL_NAME) | |
| # LLM = Ollama(model="llama3.1:latest", request_timeout=60.0, context_window=10000) | |
| Settings.embed_model = EMBED_MODEL | |
| Settings.llm = LLM | |
| class AwesumIndexBuilder(IndexBuilder): | |
| def _load_doucments(self): | |
| directory = "./awesumcare_data/awesumcare_manual_data" | |
| dir_reader = SimpleDirectoryReader(directory, file_extractor={ | |
| ".pdf": UnstructuredReader(), | |
| ".docx": UnstructuredReader(), | |
| ".pptx": UnstructuredReader(), | |
| ".md": MarkdownReader() | |
| }, | |
| recursive=True, | |
| exclude=["*.png", "*.pptx", "*.docx", "*.pdf"], | |
| 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=[ | |
| self.embed_model, | |
| ], | |
| vector_store=self.vector_store, | |
| ) | |
| pipeline.run(documents=self.documents, show_progress=True) | |
| self.index = VectorStoreIndex.from_vector_store(self.vector_store) | |
| class AwesumCareToolChatbot(Chatbot): | |
| DENIED_ANSWER_PROMPT = "" | |
| SYSTEM_PROMPT = "" | |
| CHAT_EXAMPLES = [ | |
| "什麼是安心三寶?", | |
| "點樣立平安紙?", | |
| "甚麼是⾒證?", | |
| "訂立每份⽂件需要多少錢以及付款⽅法?", | |
| "通過安⼼三寶製作的⽂件有法律效⼒嗎?", | |
| ] | |
| def _setup_observer(self): | |
| pass | |
| def _setup_index(self): | |
| 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.core.tools import QueryEngineTool | |
| self.tools = QueryEngineTool.from_defaults( | |
| query_engine=self.query_engine) | |
| return super()._setup_tools() | |
| def _setup_chat_engine(self): | |
| from llama_index.agent.openai 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") | |
| super()._setup_chat_engine() | |
| class AweSumCareContextChatbot(AwesumCareToolChatbot): | |
| def _setup_query_engine(self): | |
| pass | |
| def _setup_tools(self): | |
| pass | |
| def _setup_chat_engine(self): | |
| self.chat_engine = self.index.as_chat_engine( | |
| chat_mode=ChatMode.CONTEXT, | |
| similarity_top_k=5, | |
| system_prompt=TEXT_QA_SYSTEM_PROMPT.content, | |
| text_qa_template=CHAT_TEXT_QA_PROMPT) | |
| class AweSumCareSimpleChatbot(AwesumCareToolChatbot): | |
| def _setup_query_engine(self): | |
| pass | |
| def _setup_tools(self): | |
| pass | |
| def _setup_chat_engine(self): | |
| self.chat_engine = self.index.as_chat_engine( | |
| chat_mode=ChatMode.SIMPLE) | |
| model_name = MODEL_NAME | |
| index_builder = AwesumIndexBuilder(vdb_collection_name=VDB_COLLECTION_NAME, | |
| embed_model=EMBED_MODEL, | |
| is_load_from_vector_store=IS_LOAD_FROM_VECTOR_STORE) | |
| # gpt-3.5-turbo-1106, gpt-4-1106-preview | |
| # awesum_chatbot = AwesumCareToolChatbot(model_name=model_name, index_builder=index_builder) | |
| awesum_chatbot_context = AweSumCareContextChatbot(model_name=model_name, index_builder=index_builder) | |
| # awesum_chatbot_simple = AweSumCareSimpleChatbot(model_name=model_name, index_builder=index_builder) | |
| chatbot = gr.Chatbot(height=500) | |
| def vote(data: gr.LikeData): | |
| if data.liked: | |
| print("You upvoted this response: " + data.value) | |
| else: | |
| print("You downvoted this response: " + data.value) | |
| with gr.Blocks(fill_height=True) as demo: | |
| gr.Markdown("# Awesum Care demo") | |
| with gr.Tab("With relevant context sent to system prompt"): | |
| context_interface = gr.ChatInterface( | |
| awesum_chatbot_context.stream_chat, | |
| examples=AwesumCareToolChatbot.CHAT_EXAMPLES, | |
| chatbot=chatbot | |
| ) | |
| # gr.Markdown("instructions:\n" | |
| # "\nUsing model gpt-4-preview-1106, the most advanced model now in the market.\n" | |
| # "\n(Note that it can be much slower than gpt-3.5, openai's api can be unstable sometimes.)\n" | |
| # ) | |
| demo.queue(default_concurrency_limit=None) | |
| demo.launch(share=False) | |