Download app.py from mucdai/Chatbot: direct link, hf CLI and curl.
- Browser
- Download file 5.04 kB
-
https://huggingface.co/spaces/mucdai/Chatbot/resolve/main/app.py
- Command line
-
hf download hf://spaces/mucdai/Chatbot/app.py
-
curl -L -o app.py https://huggingface.co/spaces/mucdai/Chatbot/resolve/main/app.py
5.04 kB
| import os | |
| import openai | |
| import gradio as gr | |
| #import nest_asyncio | |
| import time | |
| import asyncio | |
| #nest_asyncio.apply() | |
| from llama_index.embeddings.openai import OpenAIEmbedding | |
| from llama_index.core.node_parser import SentenceSplitter | |
| from llama_index.llms.openai import OpenAI | |
| from llama_index.core import Settings | |
| Settings.llm = OpenAI(model="gpt-3.5-turbo-0125") | |
| # change to Huggingface embedding model | |
| Settings.embed_model = OpenAIEmbedding(model="text-embedding-ada-002") | |
| Settings.node_parser = SentenceSplitter(chunk_size=1024, chunk_overlap=128) | |
| Settings.num_output = 512 | |
| Settings.context_window = 3900 | |
| from llama_index.core import ( | |
| VectorStoreIndex, | |
| StorageContext, | |
| PromptTemplate, | |
| load_index_from_storage | |
| ) | |
| from llama_index.readers.file import PyMuPDFReader | |
| from theme import CustomTheme | |
| system_prompt = ( | |
| "You are a helpful assistant in the Bavarian ministry of science and education. " | |
| ) | |
| context = ( | |
| "Context information is below. \n" | |
| "----------------------\n" | |
| "{context_str}\n" | |
| "----------------------\n" | |
| "Given the context information and not prior knowledge, " | |
| "If you don't know the answer, tell the user that you can't answer the question - DO NOT MAKE UP AN ANSWER. " | |
| "Do not make up your own answers, refer only from the given information. " | |
| "Your answers use correct grammar and your texting style is casual. " | |
| "Always be friendly, always reply in German! " | |
| "Put the page number of the information that you are referring to in brackets after the answer. " | |
| ) | |
| prompt = ( | |
| "Context information is below. \n" | |
| "----------------------\n" | |
| "{context_str}\n" | |
| "----------------------\n" | |
| "Given the context information and not prior knowledge, " | |
| "If you don't know the answer, tell the user that you can't answer the question - DO NOT MAKE UP AN ANSWER. " | |
| "Do not make up your own answers, refer only from the given information. " | |
| "Your answers use correct grammar and your texting style is casual. " | |
| "Always be friendly, always reply in German! " | |
| "Put the page number of the information that you are referring to in brackets after the answer. " | |
| ) | |
| prompt_template = PromptTemplate(prompt) | |
| # check if storage already exists | |
| if not os.path.exists("./storage"): | |
| # load the documents and create the index | |
| #documents = SimpleDirectoryReader("data").load_data() | |
| loader = PyMuPDFReader() | |
| documents = loader.load(file_path="./data/Rahmenvereinbarung-2023-2027_ohne-Unterschrift.pdf") | |
| index = VectorStoreIndex.from_documents(documents) | |
| # store it for later | |
| index.storage_context.persist() | |
| else: | |
| # load the existing index | |
| storage_context = StorageContext.from_defaults(persist_dir="./storage") | |
| index = load_index_from_storage(storage_context) | |
| chat_engine = index.as_chat_engine( | |
| chat_mode= "context", system_prompt=system_prompt, context_template=context) | |
| query_engine = index.as_query_engine(streaming=True) | |
| #query_engine = index.as_query_engine(similarity_top_k=5) | |
| query_engine.update_prompts( | |
| {"response_synthesizer:text_qa_template": prompt_template} | |
| ) | |
| default_text="Ich beantworte Fragen zur Rahmenvereinbarung Hochschulen 2023 - 2027 gemäß Art. 8 Abs. 1 BayHIG. Wie kann ich helfen?" | |
| bot_examples = [ | |
| "Was sind die 3 zentralen Themen im Text?", | |
| "Erstelle jeweils eine Zusammenfassung zu den zentralen Themen", | |
| "Welche Vereinbarungen wurden zwischen den Universitäten und dem Ministerium getroffen?", | |
| "Wie unterscheiden sich die Vereinbarungen der Universitäten von den Vereinbarungen der Hochschulen für angewandte Wissenschaften?", | |
| "Welche Maßnahmen sind zum Ausbau der Wissenschaftskommunikation vorgesehen?", | |
| ] | |
| submit_button = gr.Button( | |
| value="Ask me", | |
| elem_classes=["ask-button"], | |
| ) | |
| def response(message, history): | |
| loop = asyncio.new_event_loop() | |
| asyncio.set_event_loop(loop) | |
| histories = chat_engine.chat_history | |
| answer = chat_engine.stream_chat(message, chat_history=histories) | |
| output_text = "" | |
| for token in answer.response_gen: | |
| time.sleep(0.1) | |
| output_text += token | |
| yield output_text | |
| #return str(answer) | |
| def main(): | |
| openai.api_key = os.environ["OPENAI_API_KEY"] | |
| custom_theme = CustomTheme() | |
| desc = "[Rahmenvereinbarung Hochschulen 2023 - 2027 gemäß Art. 8 Abs. 1 BayHIG](https://www.stmwk.bayern.de/download/22215_Rahmenvereinbarung_inkl_Unterschriften.pdf%C2%A0)" | |
| # default_text noch einbauen | |
| chatbot = gr.Chatbot( | |
| layout='bubbles', | |
| #height=600, | |
| value=[[None, default_text]] | |
| ) | |
| chat_interface = gr.ChatInterface( | |
| fn=response, | |
| retry_btn=None, | |
| undo_btn=None, | |
| title="MUC.DAI Chatbot", | |
| submit_btn=submit_button, | |
| clear_btn=None, | |
| theme=custom_theme, | |
| chatbot=chatbot, | |
| description=desc, | |
| css="style.css", | |
| examples=bot_examples, | |
| ) | |
| chat_interface.launch(inbrowser=True, debug=True) | |
| if __name__ == "__main__": | |
| main() | |