import cfg import gradio as gr import pandas as pd from cfg import setup_buster buster = setup_buster(cfg.buster_cfg) def format_sources(matched_documents: pd.DataFrame) -> str: if len(matched_documents) == 0: return "" matched_documents.similarity_to_answer = ( matched_documents.similarity_to_answer * 100 ) # print the page instead of the heading, more meaningful for hf docs matched_documents["page"] = matched_documents.apply( lambda x: x.url.split("/")[-1], axis=1 ) documents_answer_template: str = "📝 Here are the sources I used to answer your question:\n\n{documents}\n\n{footnote}" document_template: str = "[🔗 {document.page}]({document.url}), relevance: {document.similarity_to_answer:2.1f} %" documents = "\n".join( [ document_template.format(document=document) for _, document in matched_documents.iterrows() ] ) footnote: str = "I'm a bot 🤖 and not always perfect." return documents_answer_template.format(documents=documents, footnote=footnote) def add_sources(history, completion): if completion.answer_relevant: formatted_sources = format_sources(completion.matched_documents) history.append([None, formatted_sources]) return history def user(user_input, history): """Adds user's question immediately to the chat.""" return "", history + [[user_input, None]] def chat(history): user_input = history[-1][0] completion = buster.process_input(user_input) history[-1][1] = "" for token in completion.answer_generator: history[-1][1] += token yield history, completion block = gr.Blocks() with block: gr.Markdown( """

Buster 🤖: A Question-Answering Bot for your documentation

""" ) gr.Markdown( """ #### This chatbot is designed to answer any questions related to the [huggingface transformers](https://huggingface.co/docs/transformers/index) library. #### It uses ChatGPT + embeddings to search the docs for relevant sections and uses them to answer questions. It can then cite its sources back to you to verify the information. #### Note that LLMs are prone to hallucination, so all outputs should always be vetted by users. #### The Code is open-sourced and available on [Github](www.github.com/jerpint/buster)") """ ) chatbot = gr.Chatbot() with gr.Row(): with gr.Column(scale=4): question = gr.Textbox( label="What's your question?", placeholder="Ask a question to AI stackoverflow here...", lines=1, ) submit = gr.Button(value="Send", variant="secondary") examples = gr.Examples( examples=[ "What kind of models should I use for images and text?", "When should I finetune a model vs. training it form scratch?", "Can you give me some python code to quickly finetune a model on my sentiment analysis dataset?", ], inputs=question, ) gr.HTML("️
Created with ❤️ by @jerpint and @hadrienbertrand.") response = gr.State() submit.click(user, [question, chatbot], [question, chatbot], queue=False).then( chat, inputs=[chatbot], outputs=[chatbot, response] ).then(add_sources, inputs=[chatbot, response], outputs=[chatbot]) question.submit(user, [question, chatbot], [question, chatbot], queue=False).then( chat, inputs=[chatbot], outputs=[chatbot, response] ).then(add_sources, inputs=[chatbot, response], outputs=[chatbot]) block.queue(concurrency_count=16) block.launch(debug=True, share=False)