File size: 3,464 Bytes
35af015
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr

from MMD_calculate import MMDMPDetector 

detector = MMDMPDetector()  # Initialize your MMD-MP detector
MINIMUM_TOKENS = 64  # Minimum number of tokens for detection

def count_tokens(text):
    return len(text.split())  # Count the number of tokens (words) in the text

def run_detector(input_text):
    # Check if input meets the token requirement
    if count_tokens(input_text) < MINIMUM_TOKENS:
        return f"Error: Text is too short! At least {MINIMUM_TOKENS} tokens are required."
    
    # Perform detection (replace this with your model's prediction logic)
    prediction = detector.predict(input_text)
    return f"Result: {prediction}"

def change_mode(mode):
    if mode == "Low False Positive Rate":
        detector.set_mode("low-fpr")  # Adjust detector mode
    elif mode == "High Accuracy":
        detector.set_mode("accuracy")
    return f"Mode set to: {mode}"

css = """
.green { color: black!important; line-height:1.9em; padding: 0.2em 0.2em; background: #ccffcc; border-radius:0.5rem;}
.red { color: black!important; line-height:1.9em; padding: 0.2em 0.2em; background: #ffad99; border-radius:0.5rem;}
.hyperlinks {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    padding: 12px;
    margin: 0 10px;
    text-decoration: none;
    color: #000;
}
"""

with gr.Blocks(css=css, theme=gr.themes.Default(font=[gr.themes.GoogleFont("Inconsolata"), "Arial", "sans-serif"])) as app:
    # Header Row
    with gr.Row():
        with gr.Column(scale=3):
            gr.HTML("<h1>Binoculars: Zero-Shot LLM-Text Detector</h1>")
        with gr.Column(scale=1):
            gr.HTML("""
                <p class="hyperlinks">
                <a href="https://arxiv.org/abs/2401.12070" target="_blank">Paper</a> |
                <a href="https://github.com/AHans30/Binoculars" target="_blank">Code</a> |
                <a href="mailto:[email protected]" target="_blank">Contact</a>
                </p>
            """)

    # Input Section
    with gr.Row():
        input_text = gr.Textbox(placeholder="Enter text here...", lines=8, label="Input Text")

    # Mode Selector and Buttons
    with gr.Row():
        mode_selector = gr.Dropdown(
            choices=["Low False Positive Rate", "High Accuracy"], 
            label="Detection Mode", 
            value="Low False Positive Rate"
        )
        submit_button = gr.Button("Run Binoculars", variant="primary")
        clear_button = gr.Button("Clear")

    # Output Section
    with gr.Row():
        output_text = gr.Textbox(label="Prediction", value="Results will appear here...")

    # Disclaimer Section
    with gr.Accordion("Disclaimer", open=False):
        gr.Markdown("""
            - **Accuracy**: This detector uses state-of-the-art techniques, but no model is perfect.
            - **Mode Information**:
                - High Accuracy: Maximizes accuracy by adjusting thresholds.
                - Low False Positive Rate: Reduces human-written text being falsely flagged as AI-generated.
            - **Limitations**: Detection is best on texts with 64–300 tokens. Very short or extremely long texts may lead to inaccurate results.
        """)

    # Bind Functions to Buttons
    submit_button.click(run_detector, inputs=input_text, outputs=output_text)
    clear_button.click(lambda: ("", ""), outputs=[input_text, output_text])
    mode_selector.change(change_mode, inputs=mode_selector, outputs=mode_selector)