File size: 2,688 Bytes
5e7efef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

import gradio as gr
import arxiv
from transformers import pipeline
from sentence_transformers import SentenceTransformer, util

qa_pipeline = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")
embedder = SentenceTransformer("all-MiniLM-L6-v2")

def fetch_arxiv_papers(query, max_results=5):
    search = arxiv.Search(
        query=query,
        max_results=max_results,
        sort_by=arxiv.SortCriterion.Relevance
    )
    return list(search.results())

def generate_answer(question, context):
    return qa_pipeline(question=question, context=context)["answer"]

def evaluate_retrieval(query, context):
    query_embed = embedder.encode(query, convert_to_tensor=True)
    context_embed = embedder.encode(context, convert_to_tensor=True)
    similarity = util.pytorch_cos_sim(query_embed, context_embed)
    score = float(similarity[0][0])
    if score > 0.7:
        return "High"
    elif score > 0.4:
        return "Medium"
    else:
        return "Low"

def evaluate_summary(context, answer):
    if answer.lower() in context.lower():
        return "Good"
    elif len(answer.split()) > 5:
        return "Fair"
    else:
        return "Poor"

def rag_pipeline(user_query):
    papers = fetch_arxiv_papers(user_query)
    if not papers:
        return "No relevant papers found.", "", ""

    output_blocks = []
    for i, paper in enumerate(papers, 1):
        title = paper.title
        abstract = paper.summary
        link = paper.entry_id
        answer = generate_answer(user_query, abstract)
        retrieval_score = evaluate_retrieval(user_query, abstract)
        summary_score = evaluate_summary(abstract, answer)

        block = f"""
### Paper {i}

Title: {title}

Abstract: {abstract}

Summarized Answer: {answer}

Link: {link}

Retrieval Accuracy: {retrieval_score}   
Summary Quality: {summary_score}

---"""
        output_blocks.append(block)

    final_output = "\n".join(output_blocks)
    return final_output, "Multiple Papers Shown", "See Above"

# Gradio UI
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="green")) as demo:
    gr.Markdown("## Scientific Paper Discovery — RAG-Based QA & Evaluation")
    gr.Markdown("Enter your research topic below to explore papers from arXiv and get summarized insights.")

    query = gr.Textbox(label="Enter a research topic")
    run_btn = gr.Button("Search and Summarize")

    output = gr.Markdown(label="Output")
    retrieval_accuracy = gr.Textbox(label="Retrieval Accuracy")
    summary_quality = gr.Textbox(label="Summary Quality")

    run_btn.click(fn=rag_pipeline, inputs=query, outputs=[output, retrieval_accuracy, summary_quality])

demo.launch()