bwook's picture
Rename web.py to app.py
7e0880a verified
import os
import pathlib
import gradio as gr
import pandas as pd
import yaml
from autorag.evaluator import Evaluator
from src.runner import GradioStreamRunner
root_dir = os.path.dirname(os.path.realpath(__file__))
# Paths to example files
config_dir = os.path.join(root_dir, "config")
# Non-GPU Examples
non_gpu = os.path.join(config_dir, "non_gpu")
simple_openai = os.path.join(non_gpu, "simple_openai.yaml")
simple_openai_korean = os.path.join(non_gpu, "simple_openai_korean.yaml")
compact_openai = os.path.join(non_gpu, "compact_openai.yaml")
compact_openai_korean = os.path.join(non_gpu, "compact_openai_korean.yaml")
half_openai = os.path.join(non_gpu, "half_openai.yaml")
half_openai_korean = os.path.join(non_gpu, "half_openai_korean.yaml")
full_openai = os.path.join(non_gpu, "full_no_rerank_openai.yaml")
non_gpu_examples_list = [
simple_openai, simple_openai_korean, compact_openai, compact_openai_korean, half_openai, half_openai_korean,
full_openai
]
non_gpu_examples = list(map(lambda x: [x], non_gpu_examples_list))
# GPU Examples
gpu = os.path.join(config_dir, "gpu")
compact_openai_gpu = os.path.join(gpu, "compact_openai.yaml")
compact_openai_korean_gpu = os.path.join(gpu, "compact_openai_korean.yaml")
half_openai_gpu = os.path.join(gpu, "half_openai.yaml")
half_openai_korean_gpu = os.path.join(gpu, "half_openai_korean.yaml")
full_openai_gpu = os.path.join(gpu, "full_no_rerank_openai.yaml")
gpu_examples_list = [
compact_openai_gpu, compact_openai_korean_gpu, half_openai_gpu, half_openai_korean_gpu, full_openai_gpu
]
gpu_examples = list(map(lambda x: [x], gpu_examples_list))
# GPU + API
gpu_api = os.path.join(config_dir, "gpu_api")
compact_openai_gpu_api = os.path.join(gpu_api, "compact_openai.yaml")
compact_openai_korean_gpu_api = os.path.join(gpu_api, "compact_openai_korean.yaml")
half_openai_gpu_api = os.path.join(gpu_api, "half_openai.yaml")
half_openai_korean_gpu_api = os.path.join(gpu_api, "half_openai_korean.yaml")
full_openai_gpu_api = os.path.join(gpu_api, "full_no_rerank_openai.yaml")
gpu_api_examples_list = [
compact_openai_gpu_api, compact_openai_korean_gpu_api, half_openai_gpu_api, half_openai_korean_gpu_api,
full_openai_gpu_api
]
gpu_api_examples = list(map(lambda x: [x], gpu_api_examples_list))
example_qa_parquet = os.path.join(root_dir, "sample_data", "qa_data_sample.parquet")
example_corpus_parquet = os.path.join(root_dir, "sample_data", "corpus_data_sample.parquet")
def display_yaml(file):
if file is None:
return "No file uploaded"
with open(file.name, "r") as f:
content = yaml.safe_load(f)
return yaml.dump(content, default_flow_style=False)
def display_parquet(file):
if file is None:
return pd.DataFrame()
df = pd.read_parquet(file.name)
return df
def check_files(yaml_file, qa_file, corpus_file):
if yaml_file is not None and qa_file is not None and corpus_file is not None:
return gr.update(visible=True)
return gr.update(visible=False)
def run_trial(file, yaml_file, qa_file, corpus_file):
project_dir = os.path.join(pathlib.PurePath(file.name).parent, "project")
evaluator = Evaluator(qa_file, corpus_file, project_dir=project_dir)
evaluator.start_trial(yaml_file, skip_validation=True)
return ("❗Trial Completed❗ "
"Go to Chat Tab to start the conversation")
def set_environment_variable(api_name, api_key):
if api_name and api_key:
try:
os.environ[api_name] = api_key
return "✅ Setting Complete ✅"
except Exception as e:
return f"Error setting environment variable: {e}"
return "API Name or Key is missing"
def stream_default(file, history):
# Default YAML Runner
yaml_path = os.path.join(config_dir, "extracted_sample.yaml")
project_dir = os.path.join(
pathlib.PurePath(file.name).parent, "project"
)
default_gradio_runner = GradioStreamRunner.from_yaml(yaml_path, project_dir)
history.append({"role": "assistant", "content": ""})
# Stream responses for the chatbox
for default_output in default_gradio_runner.stream_run(history[-2]["content"]):
stream_delta = default_output[0]
history[-1]["content"] = stream_delta
yield history
def stream_optimized(file, history):
# Custom YAML Runner
trial_dir = os.path.join(pathlib.PurePath(file.name).parent, "project", "0")
custom_gradio_runner = GradioStreamRunner.from_trial_folder(trial_dir)
history.append({"role": "assistant", "content": ""})
for output in custom_gradio_runner.stream_run(history[-2]["content"]):
stream_delta = output[0]
history[-1]["content"] = stream_delta
yield history
def user(user_message, history: list):
return "", history + [{"role": "user", "content": user_message}]
with gr.Blocks(theme="earneleh/paris") as demo:
gr.Markdown("# AutoRAG Trial & Debugging Interface")
with gr.Tabs() as tabs:
with gr.Tab("Environment Variables"):
gr.Markdown("## Environment Variables")
with gr.Row(): # Arrange horizontally
with gr.Column(scale=3):
api_name = gr.Textbox(
label="Environment Variable Name",
type="text",
placeholder="Enter your Environment Variable Name",
)
gr.Examples(examples=[["OPENAI_API_KEY"]], inputs=api_name)
with gr.Column(scale=7):
api_key = gr.Textbox(
label="API Key",
type="password",
placeholder="Enter your API Key",
)
set_env_button = gr.Button("Set Environment Variable")
env_output = gr.Textbox(
label="Status", interactive=False
)
api_key.submit(
set_environment_variable, inputs=[api_name, api_key], outputs=env_output
)
set_env_button.click(
set_environment_variable, inputs=[api_name, api_key], outputs=env_output
)
with gr.Tab("File Upload"):
with gr.Row() as file_upload_row:
with gr.Column(scale=3):
yaml_file = gr.File(
label="Upload YAML File",
file_count="single",
)
make_yaml_button = gr.Button("Make Your Own YAML File",
link="https://tally.so/r/mBQY5N")
with gr.Column(scale=7):
yaml_content = gr.Textbox(label="YAML File Content")
gr.Markdown("Here is the Sample YAML File. Just click the file ❗")
gr.Markdown("### Non-GPU Examples")
gr.Examples(examples=non_gpu_examples, inputs=yaml_file)
with gr.Row():
# Section for GPU examples
with gr.Column():
gr.Markdown("### GPU Examples")
gr.Markdown(
"**⚠️ Warning**: Here are the YAML files containing the modules that use the **local model**.")
gr.Markdown(
"Note that if you Run_Trial in a non-GPU environment, **it can take a very long time**.")
gr.Examples(examples=gpu_examples, inputs=yaml_file)
make_gpu = gr.Button("Use AutoRAG GPU Feature",
link="https://tally.so/r/3j7rP6")
# Section for GPU + API examples
with gr.Column():
gr.Markdown("### GPU + API Examples")
gr.Markdown(
"**⚠️ Warning**: Here are the YAML files containing the modules that use the **local model** and **API Based Model**.")
gr.Markdown("You need to set **JINA_API_KEY**, **COHERE_API_KEY**, **MXBAI_API_KEY** and **VOYAGE_API_KEY** as environment variables to use this feature. ")
gr.Examples(examples=gpu_api_examples, inputs=yaml_file)
gpu_api_button = gr.Button("Use AutoRAG API KEY Feature",
link="https://tally.so/r/waD1Ab")
with gr.Row() as qa_upload_row:
with gr.Column(scale=3):
qa_file = gr.File(
label="Upload qa.parquet File",
file_count="single",
)
# Add button for QA
make_qa_button = gr.Button("Make Your Own QA Data",
link="https://huggingface.co/spaces/AutoRAG/AutoRAG-data-creation")
with gr.Column(scale=7):
qa_content = gr.Dataframe(label="QA Parquet File Content")
gr.Markdown("Here is the Sample QA File. Just click the file ❗")
gr.Examples(examples=[[example_qa_parquet]], inputs=qa_file)
with gr.Row() as corpus_upload_row:
with gr.Column(scale=3):
corpus_file = gr.File(
label="Upload corpus.parquet File",
file_count="single",
)
make_corpus_button = gr.Button("Make Your Own Corpus Data",
link="https://huggingface.co/spaces/AutoRAG/AutoRAG-data-creation")
with gr.Column(scale=7):
corpus_content = gr.Dataframe(label="Corpus Parquet File Content")
gr.Markdown(
"Here is the Sample Corpus File. Just click the file ❗"
)
gr.Examples(examples=[[example_corpus_parquet]], inputs=corpus_file)
run_trial_button = gr.Button("Run Trial", visible=False)
trial_output = gr.Textbox(label="Trial Output", visible=False)
yaml_file.change(display_yaml, inputs=yaml_file, outputs=yaml_content)
qa_file.change(display_parquet, inputs=qa_file, outputs=qa_content)
corpus_file.change(
display_parquet, inputs=corpus_file, outputs=corpus_content
)
yaml_file.change(
check_files,
inputs=[yaml_file, qa_file, corpus_file],
outputs=run_trial_button,
)
qa_file.change(
check_files,
inputs=[yaml_file, qa_file, corpus_file],
outputs=run_trial_button,
)
corpus_file.change(
check_files,
inputs=[yaml_file, qa_file, corpus_file],
outputs=run_trial_button,
)
run_trial_button.click(
lambda: (
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=False),
gr.update(visible=True),
),
outputs=[
file_upload_row,
qa_upload_row,
corpus_upload_row,
trial_output,
],
)
run_trial_button.click(
run_trial,
inputs=[yaml_file, yaml_file, qa_file, corpus_file],
outputs=trial_output,
)
# New Chat Tab
with gr.Tab("Chat") as chat_tab:
gr.Markdown("### Compare Chat Models")
question_input = gr.Textbox(
label="Your Question", placeholder="Type your question here..."
)
pseudo_input = gr.Textbox(label="havertz", visible=False)
with gr.Row():
# Left Chatbox (Default YAML)
with gr.Column():
gr.Markdown("#### Naive RAG Chat")
default_chatbox = gr.Chatbot(label="Naive RAG Conversation",type="messages")
# Right Chatbox (Custom YAML)
with gr.Column():
gr.Markdown("#### Optimized RAG Chat")
custom_chatbox = gr.Chatbot(label="Optimized RAG Conversation",type="messages")
question_input.submit(lambda x: x, inputs=[question_input], outputs=[pseudo_input]).then(
user, [question_input, default_chatbox], outputs=[question_input, default_chatbox], queue=False
).then(
stream_default,
inputs=[yaml_file, default_chatbox],
outputs=[default_chatbox],
)
pseudo_input.change(
user, [pseudo_input, custom_chatbox], outputs=[question_input, custom_chatbox], queue=False).then(
stream_optimized,
inputs=[yaml_file, custom_chatbox],
outputs=[custom_chatbox],
)
deploy_button = gr.Button("Deploy",
link="https://tally.so/r/3XM7y4")
if __name__ == "__main__":
# Run the interface
demo.launch(share=False, debug=True)