import gradio as gr from llama_cpp import Llama from huggingface_hub import hf_hub_download # Load a user-specified model def load_user_model(repo_id, model_file): print(f"Downloading model {model_file} from repository {repo_id}...") local_path = hf_hub_download(repo_id=repo_id, filename=model_file) print(f"Model downloaded to: {local_path}") return Llama(model_path=local_path, n_ctx=2048, n_threads=8) # Generate a response using the specified model and prompt def generate_response(model, prompt): response = model(prompt, max_tokens=1024, temperature=1.5, min_p=0.1) return response["choices"][0]["text"] # Evaluate responses using the LoRA evaluation model def evaluate_responses(prompt, repo_a, model_a, repo_b, model_b): # Load models model_a_instance = load_user_model(repo_a, model_a) model_b_instance = load_user_model(repo_b, model_b) # Generate responses response_a = generate_response(model_a_instance, prompt) response_b = generate_response(model_b_instance, prompt) # Display generated responses print(f"Response A: {response_a}") print(f"Response B: {response_b}") # Format the evaluation prompt evaluation_prompt = f""" Prompt: {prompt} Response A: {response_a} Response B: {response_b} Evaluation Criteria: Relevance, Coherence and Completeness Please evaluate the responses based on the selected criteria. For each criterion, rate both responses on a scale from 1 to 4 and provide a justification. Finally, declare the winner (or 'draw' if they are equal). """ # Use the LoRA model to evaluate the responses evaluation_response = lora_model.create_completion( prompt=evaluation_prompt, max_tokens=512, temperature=1.5, min_p=0.1 ) evaluation_results = evaluation_response["choices"][0]["text"] # Combine results for display final_output = f""" {evaluation_results} """ return final_output, response_a, response_b # Load the LoRA evaluation model def load_lora_model(): repo_id = "KolumbusLindh/LoRA-6150" model_file = "unsloth.F16.gguf" print(f"Downloading LoRA evaluation model from repository {repo_id}...") local_path = hf_hub_download(repo_id=repo_id, filename=model_file) print(f"LoRA evaluation model downloaded to: {local_path}") return Llama(model_path=local_path, n_ctx=2048, n_threads=8) lora_model = load_lora_model() print("LoRA evaluation model loaded successfully!") # Gradio interface with gr.Blocks(title="LLM as a Judge") as demo: gr.Markdown("## LLM as a Judge 🧐") gr.Markdown("Welcome to the LLM as a Judge demo! This application uses a finetuned LLM to evaluate responses generated by two different models based on Relevance, Coherence and Completeness. The model will then evaluate the responses based on the criteria and determine the winner.") gr.Markdown("The default models are models we have finetuned on the FineTome-100k dataset, using Llama 3.2 3B as the base model. You can also specify your own models by entering the Hugging Face repository name and model filename for Model A and Model B. Just make sure they are in GGUF format.") # Model inputs repo_a_input = gr.Textbox(label="Model A Repository", placeholder="Enter the Hugging Face repo name for Model A...", value="forestav/LoRA-2000") model_a_input = gr.Textbox(label="Model A File Name", placeholder="Enter the model filename for Model A...", value="unsloth.F16.gguf") repo_b_input = gr.Textbox(label="Model B Repository", placeholder="Enter the Hugging Face repo name for Model B...", value="KolumbusLindh/LoRA-6150") model_b_input = gr.Textbox(label="Model B File Name", placeholder="Enter the model filename for Model B...", value="unsloth.F16.gguf") # Prompt and criteria inputs prompt_input = gr.Textbox(label="Enter Prompt", placeholder="Enter the prompt here...", lines=3) # Button and outputs evaluate_button = gr.Button("Evaluate Models") with gr.Row(): with gr.Column(): response_a = gr.Textbox( label="Response A", placeholder="The response from Model A will appear here...", lines=20, interactive=False ) with gr.Column(): response_b = gr.Textbox( label="Response B", placeholder="The response from Model B will appear here...", lines=20, interactive=False ) gr.Markdown("### The LLMs are evaluated based on the criterion of Relevance, Coherence and Completeness.") evaluation_output = gr.Textbox( label="Evaluation Results", placeholder="The evaluation results will appear here...", lines=20, interactive=False ) # Link evaluation function evaluate_button.click( fn=evaluate_responses, inputs=[prompt_input, repo_a_input, model_a_input, repo_b_input, model_b_input], outputs=[evaluation_output, response_a, response_b] ) # Launch app if __name__ == "__main__": demo.launch()