jeffrey
add RAG pipeline optimization link
f7e4967
import asyncio
import os.path
import tempfile
import uuid
from typing import List
import gradio
import gradio as gr
import openai
import pandas as pd
from autorag.evaluator import Evaluator
from src.data.chunk import chunk
from src.data.parse import parse_pdf
from src.runner import GradioStreamRunner
from gradio import ChatMessage
root_dir = os.path.dirname(os.path.realpath(__file__))
pseudo_trial_yaml_path = os.path.join(root_dir, "config", "init_project_for_pseudo_trial.yaml")
init_run_yaml = os.path.join(root_dir, "config", "init_project_for_run.yaml")
gradio_runner = None
# Code for Task 1
def file_ingest(input_files: List[str], temp_project_dir, progress=gr.Progress()):
if os.getenv("OPENAI_API_KEY") is None:
return "Please submit your OpenAI API key first."
if not input_files:
return "Please upload a file first."
progress(0.05)
# do parse
raw_df = parse_pdf(file_lists=input_files)
progress(0.3)
# do chunk
corpus_df = chunk(raw_df, method="recursivecharacter",
lang="en", chunk_size=512, chunk_overlap=128)
progress(0.5)
asyncio.sleep(0.5)
# Logic for button click
empty_qa_df = make_empty_qa(corpus_df=corpus_df)
with tempfile.TemporaryDirectory() as temp_data_dir:
empty_qa_df.to_parquet(os.path.join(temp_data_dir, "empty_qa.parquet"))
corpus_df.to_parquet(os.path.join(temp_data_dir, "corpus.parquet"))
evaluator = Evaluator(qa_data_path=os.path.join(temp_data_dir, "empty_qa.parquet"),
corpus_data_path=os.path.join(temp_data_dir, "corpus.parquet"),
project_dir=temp_project_dir)
evaluator.start_trial(pseudo_trial_yaml_path, skip_validation=True)
yield "Setting up"
progress(0.9)
set_runner(temp_project_dir)
progress(1.0)
yield "File uploaded complete. You can use it at chatbot now."
def make_empty_qa(corpus_df: pd.DataFrame):
doc_id = corpus_df["doc_id"].iloc[0]
return pd.DataFrame({
"qid": str(uuid.uuid4()),
"query": ["Who is Kai Havertz?"],
"retrieval_gt": [[[doc_id]]],
"generation_gt": [["Havertz is the greatest footballer."]],
})
def on_submit_openai_key(openai_key):
os.environ["OPENAI_API_KEY"] = openai_key
# Test openai key
try:
client = openai.OpenAI()
response = client.chat.completions.create(
messages=[
{"role": "user", "content": "What is the capital of France?"},
],
model="gpt-4o-mini",
max_tokens=3,
)
assert isinstance(response.choices[0].message.content, str)
gr.Info("OpenAI API key submitted.", duration=3)
return "Setting complete."
except openai.AuthenticationError as e:
gr.Error("OpenAI API key is invalid.", duration=3)
return "Not Set"
except AssertionError as e:
gr.Error("OpenAI server is not working properly.", duration=3)
return "Not Set"
def set_runner(project_dir):
runner = GradioStreamRunner.from_yaml(yaml_path=init_run_yaml, project_dir=project_dir)
global gradio_runner
gradio_runner = runner
def get_response(history):
global gradio_runner
if gradio_runner is None:
gradio.Warning("Please set the AutoRAG server first.")
return
if os.getenv("OPENAI_API_KEY", None) is None:
gradio.Warning("Please submit your OpenAI API key first.")
return
history.append({"role": "assistant", "content": ""})
for output in 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}]
# interface one
with gr.Blocks(theme="earneleh/paris") as demo:
with tempfile.TemporaryDirectory() as project_dir:
# Define components
with gr.Row():
with gr.Column(scale=3):
textbox = gr.Textbox(label="Please input your OpenAI API key and press Enter.", type="password",
info="You can get your API key from https://platform.openai.com/account/api-keys\n"
"AutoRAG do not store your API key.",
autofocus=True)
api_key_status_box = gr.Textbox(label="OpenAI API status", value="Not Set", interactive=False)
gr.Markdown("## Ingest Your Data")
file_input = gr.File(label="Upload Files", type="filepath", file_count="multiple")
button = gr.Button("Submit file")
text_output = gr.Textbox(label="Status update", interactive=False)
# Define layout and interactions
textbox.submit(on_submit_openai_key, inputs=[textbox], outputs=api_key_status_box)
button.click(file_ingest, inputs=[file_input, gr.State(project_dir)], outputs=[text_output])
with gr.Column(scale=7):
gr.Markdown("## This is your Naive RAG Chatbot 🚀")
chatbot = gr.Chatbot(type="messages", height=600)
chat_input = gr.Textbox()
clear = gr.Button(value="Clear Chat🗑️")
chat_input.submit(user, [chat_input, chatbot], outputs=[chat_input, chatbot], queue=False).then(
get_response, inputs=chatbot, outputs=[chatbot]
)
clear.click(lambda: None, None, chatbot, queue=False)
gr.Markdown("## Do you like the result?\n\nIf you don't like it, try to optimize it with AutoRAG. Press below button and go to make evaluation data and optimize it. Both on the Huggingface space so you don't need to install anything.")
with gr.Row():
open_data_creation = gr.Button(value="1️⃣ : Data Creation",
link="https://huggingface.co/spaces/AutoRAG/AutoRAG-data-creation")
open_optimize = gr.Button(value="2️⃣ : Optimize", link="https://huggingface.co/spaces/AutoRAG/RAG-Pipeline-Optimization")
# if __name__ == "__main__":
# demo.launch(share=False, debug=True)
demo.launch(share=False, debug=False)