|
import gradio as gr |
|
import requests |
|
import asyncio |
|
import aiohttp |
|
import os |
|
|
|
HF_API_TOKEN = os.getenv("HF_API_TOKEN") |
|
|
|
|
|
|
|
|
|
models = { |
|
"Mistral-7B-Instruct": "https://api-inference.huggingface.co/models/mistralai/Mistral-7B-Instruct-v0.2", |
|
"DeepSeek-7B-Instruct": "https://api-inference.huggingface.co/models/deepseek-ai/deepseek-llm-7b-instruct", |
|
"Qwen-7B-Chat": "https://api-inference.huggingface.co/models/Qwen/Qwen-7B-Chat" |
|
} |
|
|
|
|
|
judge_model_url = "https://api-inference.huggingface.co/models/mistralai/Mixtral-8x7B-Instruct-v0.1" |
|
|
|
|
|
API_TOKEN = HF_API_TOKEN |
|
HEADERS = {"Authorization": f"Bearer {API_TOKEN}"} |
|
|
|
|
|
async def query_model(session, model_name, question): |
|
payload = {"inputs": question, "parameters": {"max_new_tokens": 300}} |
|
try: |
|
async with session.post(models[model_name], headers=HEADERS, json=payload, timeout=60) as response: |
|
result = await response.json() |
|
if isinstance(result, list) and len(result) > 0: |
|
return model_name, result[0]["generated_text"] |
|
elif isinstance(result, dict) and "generated_text" in result: |
|
return model_name, result["generated_text"] |
|
else: |
|
return model_name, str(result) |
|
except Exception as e: |
|
return model_name, f"Error: {str(e)}" |
|
|
|
|
|
async def gather_model_answers(question): |
|
async with aiohttp.ClientSession() as session: |
|
tasks = [query_model(session, model_name, question) for model_name in models] |
|
results = await asyncio.gather(*tasks) |
|
return dict(results) |
|
|
|
|
|
def judge_best_answer(question, answers): |
|
|
|
judge_prompt = f""" |
|
You are a wise AI Judge. A user asked the following question: |
|
|
|
Question: |
|
{question} |
|
|
|
Here are the answers provided by different models: |
|
|
|
Answer 1 (Mistral-7B-Instruct): |
|
{answers['Mistral-7B-Instruct']} |
|
|
|
Answer 2 (DeepSeek-7B-Instruct): |
|
{answers['DeepSeek-7B-Instruct']} |
|
|
|
Answer 3 (Qwen-7B-Chat): |
|
{answers['Qwen-7B-Chat']} |
|
|
|
Please carefully read all three answers. Your job: |
|
- Pick the best answer (Answer 1, Answer 2, or Answer 3). |
|
- Explain briefly why you chose that answer. |
|
|
|
Respond in this JSON format: |
|
{{"best_answer": "Answer X", "reason": "Your reasoning here"}} |
|
""".strip() |
|
|
|
payload = {"inputs": judge_prompt, "parameters": {"max_new_tokens": 300}} |
|
response = requests.post(judge_model_url, headers=HEADERS, json=payload) |
|
|
|
if response.status_code == 200: |
|
result = response.json() |
|
|
|
import json |
|
import re |
|
|
|
|
|
match = re.search(r"\{.*\}", str(result)) |
|
if match: |
|
try: |
|
judge_decision = json.loads(match.group(0)) |
|
return judge_decision |
|
except json.JSONDecodeError: |
|
return {"best_answer": "Unknown", "reason": "Failed to parse judge output."} |
|
else: |
|
return {"best_answer": "Unknown", "reason": "No JSON found in judge output."} |
|
else: |
|
return {"best_answer": "Unknown", "reason": f"Judge API error: {response.status_code}"} |
|
|
|
|
|
def multi_model_qa(question): |
|
answers = asyncio.run(gather_model_answers(question)) |
|
judge_decision = judge_best_answer(question, answers) |
|
|
|
|
|
best_answer_key = judge_decision.get("best_answer", "") |
|
best_answer_text = "" |
|
if "1" in best_answer_key: |
|
best_answer_text = answers["Mistral-7B-Instruct"] |
|
elif "2" in best_answer_key: |
|
best_answer_text = answers["DeepSeek-7B-Instruct"] |
|
elif "3" in best_answer_key: |
|
best_answer_text = answers["Qwen-7B-Chat"] |
|
else: |
|
best_answer_text = "Could not determine best answer." |
|
|
|
return ( |
|
answers["Mistral-7B-Instruct"], |
|
answers["DeepSeek-7B-Instruct"], |
|
answers["Qwen-7B-Chat"], |
|
best_answer_text, |
|
judge_decision.get("reason", "No reasoning provided.") |
|
) |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# 🧠 Multi-Model Answer Aggregator") |
|
gr.Markdown("Ask any question. The system queries multiple models and the AI Judge selects the best answer.") |
|
|
|
question_input = gr.Textbox(label="Enter your question", placeholder="Ask me anything...", lines=2) |
|
submit_btn = gr.Button("Get Best Answer") |
|
|
|
mistral_output = gr.Textbox(label="Mistral-7B-Instruct Answer") |
|
deepseek_output = gr.Textbox(label="DeepSeek-7B-Instruct Answer") |
|
qwen_output = gr.Textbox(label="Qwen-7B-Chat Answer") |
|
best_answer_output = gr.Textbox(label="🏆 Best Answer Selected") |
|
judge_reasoning_output = gr.Textbox(label="⚖️ Judge's Reasoning") |
|
|
|
submit_btn.click( |
|
multi_model_qa, |
|
inputs=[question_input], |
|
outputs=[mistral_output, deepseek_output, qwen_output, best_answer_output, judge_reasoning_output] |
|
) |
|
|
|
demo.launch() |
|
|