Download app.py from WNJXYK/RPC: direct link, hf CLI and curl.
- Browser
- Download file 8.48 kB
-
https://huggingface.co/spaces/WNJXYK/RPC/resolve/fc6f0c5c5534380262d0ac052bcde092e4911bfd/app.py
- Command line
-
hf download hf://spaces/WNJXYK/RPC@fc6f0c5c5534380262d0ac052bcde092e4911bfd/app.py
-
curl -L -o app.py https://huggingface.co/spaces/WNJXYK/RPC/resolve/fc6f0c5c5534380262d0ac052bcde092e4911bfd/app.py
8.48 kB
| import gradio as gr | |
| import json, os | |
| from huggingface_hub import hf_hub_download | |
| from compute_perp import prep_evaluator, numberic_compare, check_equal | |
| from compute_sc import sc_evaluator | |
| from compute_rpc import wpc_evaluator | |
| import numpy as np | |
| def greet(name): | |
| return "Hello " + name + "!!" | |
| json_file = {"predict": [], "answer": [], "completion": [], "mean_logprob": [], "prompt": []} | |
| demo = gr.Blocks() | |
| with demo: | |
| paper_title = gr.HTML("""<div align='center'><h1>[NeurIPS 2025] A Theoretical Study on Bridging Internal Probability and Self-Consistency for LLM Reasoning</h1></div>""") | |
| paper_info = gr.HTML("""<div align="center"><h3><a href="https://arxiv.org/pdf/2502.00511">📄 [Paper]</a> • <a href="https://wnjxyk.github.io/RPC">🌐 [Project]</a> • <a href="#" onclick="document.getElementById('bibtex-popup').style.display='block';">📚 [BibTeX]</a><h3> | |
| <div id="bibtex-popup" style="display:none; position:fixed; top:50%; left:50%; transform:translate(-50%, -50%); background:white; padding:20px; border:1px solid #ccc; box-shadow:0 0 10px rgba(0,0,0,0.2); z-index:1000; max-width:80%; overflow:auto;"> | |
| <pre style="white-space:pre-wrap; font-size:12px; text-align:left;">@inproceedings{zhou24theoretical, | |
| author = {Zhou, Zhi and Tan, Yuhao and Li, Zenan and Yao, Yuan and Guo, Lan-Zhe and Li, Yu-Feng and Ma, Xiaoxing}, | |
| title = {A Theorecial Study on Bridging Internal Probability and Self-Consistency for LLM Reasoning}, | |
| booktitle = {Advances in Neural Information Processing Systems}, | |
| year = {2025}, | |
| }</pre> | |
| <button onclick="document.getElementById('bibtex-popup').style.display='none';" style="margin-top:10px; padding:5px 10px;">Close</button> | |
| </div></div>""") | |
| with gr.Column(): | |
| gr.Markdown("## 1. Experimental Settings") | |
| with gr.Row(): | |
| dataset = gr.Dropdown( | |
| choices=["MATH", "MathOdyssey", "AIME", "OlympiadBench"], | |
| value="MathOdyssey", | |
| label="Dataset", | |
| interactive=True | |
| ) | |
| model = gr.Dropdown( | |
| choices=["Deepseek-Math-RL-7B", "InternLM2-Math-Plus-1.8B", "InternLM2-Math-Plus-7B"], | |
| value="InternLM2-Math-Plus-7B", | |
| label="Model", | |
| interactive=True | |
| ) | |
| k_value = gr.Dropdown( | |
| choices=[8, 16, 32, 64, 128], | |
| value=128, | |
| label="K (Number of Sampled Reasoning Paths)", | |
| interactive=True | |
| ) | |
| seed = gr.Number( | |
| label="Random Seed", | |
| value=998244353, | |
| step=1, | |
| interactive=True | |
| ) | |
| def update_k_value(dataset_choice): | |
| if dataset_choice == "MATH": | |
| return gr.update(choices=[8, 16, 32, 64], value=min(64, k_value.value)) | |
| else: | |
| return gr.update(choices=[8, 16, 32, 64, 128], value=k_value.value) | |
| dataset.change(fn=update_k_value, inputs=dataset, outputs=k_value) | |
| load_btn = gr.Button("Load All Problems") | |
| with gr.Column(visible=False) as content_column: | |
| gr.Markdown("## 2. Problem Selection") | |
| with gr.Group(): | |
| data_info = gr.Textbox(label="Experiment Info", value="") | |
| problem_id = gr.Dropdown( | |
| choices=[1], | |
| value=1, | |
| label="Problem ID (We removed (1) problems that were unlikely to be answered correctly using any of the methods; (2) easy problems)", | |
| interactive=True | |
| ) | |
| with gr.Row(): | |
| problem_prompt = gr.Textbox(label="Problem Prompt", value="", scale=3) | |
| problem_answer = gr.Textbox(label="Problem Answer", value="", scale=1) | |
| def update_problem_info(problem_id): | |
| return gr.update(value=json_file['prompt'][problem_id-1], label=f"Problem#{problem_id} Prompt"), gr.update(value=json_file['answer'][problem_id-1], label=f"Problem#{problem_id} Answer") | |
| problem_id.change(fn=update_problem_info, inputs=problem_id, outputs=[problem_prompt, problem_answer]) | |
| run_btn = gr.Button("Run Evaluation") | |
| with gr.Column(visible=False) as result_column: | |
| gr.Markdown("## 3. Experiment Result") | |
| with gr.Row(): | |
| with gr.Column(): | |
| gr.Markdown("### PPL (Internal Probability)") | |
| ppl_result = gr.Markdown() | |
| with gr.Column(): | |
| gr.Markdown("### SC (Self-Consistency)") | |
| sc_result = gr.Markdown(value="") | |
| with gr.Column(): | |
| gr.Markdown("### RPC (Ours)") | |
| rpc_result = gr.Markdown(value="") | |
| def get_available_problems(): | |
| global json_file | |
| answer = np.array(json_file["accuracy"]).mean(axis=0) | |
| # print(answer.shape) | |
| # Select indices where the answer is greater than 0.3 | |
| available_indices = np.where((answer > 0.3) & (answer < 0.5))[0] | |
| available_indices = available_indices + 1 | |
| # print(available_indices) | |
| return available_indices.tolist() | |
| def load(dataset, model, k_value, seed): | |
| try: | |
| repo_id = { | |
| "MATH": "WNJXYK/MATH-Reasoning-Paths", | |
| "MathOdyssey": "WNJXYK/MathOdyssey-Reasoning-Paths", | |
| "AIME": "WNJXYK/AIME_1983_2024-Reasoning-Paths", | |
| "OlympiadBench": "WNJXYK/OlympiadBench-Reasoning-Paths" | |
| }[dataset] | |
| filename = f"{model}.json" | |
| yield f"Downloading sampled reasoning paths from Hugging Face {repo_id}...", gr.update(visible=False), gr.update(), gr.update(), gr.update(visible=False) | |
| file_path = hf_hub_download(repo_id=repo_id, filename=filename, repo_type="dataset") | |
| global json_file | |
| with open(file_path, 'r', encoding='utf-8') as f: | |
| json_file = json.load(f) | |
| clist = get_available_problems() | |
| os.remove(file_path) | |
| yield "Loading complete! You can now select a problem ID.", gr.update(visible=True), gr.update(value=f"Dataset: {dataset}\tModel: {model}\tK: {k_value}\tSeed: {seed}"), gr.update(choices=clist, value=clist[0]), gr.update(visible=False) | |
| except Exception as e: | |
| yield f"Error: {str(e)}" | |
| def res_to_str(correct, answers, topk=10): | |
| answers = sorted(answers, key=lambda x: x[1], reverse=True) | |
| response = "| # | Answer | Probability | Correct |\n|---|--------|------------|--------|\n" | |
| for i in range(min(len(answers), topk)): | |
| correct_mark = "✅" if answers[i][2] else "❌" | |
| wrapped_answer = answers[i][0] if len(answers[i][0]) <= 10 else answers[i][0][:10] + "..." | |
| response += f"| Top-{i+1} | {wrapped_answer} | {answers[i][1]:.2f} | {correct_mark} |\n" | |
| return response | |
| def evaluate(problem_id): | |
| ppl_correct, ppl_answers = prep_evaluator( | |
| json_file["predict"][problem_id-1], | |
| json_file["completion"][problem_id-1], | |
| json_file["mean_logprob"][problem_id-1], | |
| json_file["answer"][problem_id-1], | |
| numberic_compare, | |
| check_equal | |
| ) | |
| sc_correct, sc_answers = sc_evaluator( | |
| json_file["predict"][problem_id-1], | |
| json_file["completion"][problem_id-1], | |
| json_file["mean_logprob"][problem_id-1], | |
| json_file["answer"][problem_id-1], | |
| numberic_compare, | |
| check_equal | |
| ) | |
| rpc_correct, rpc_answers = wpc_evaluator( | |
| json_file["predict"][problem_id-1], | |
| json_file["completion"][problem_id-1], | |
| json_file["mean_logprob"][problem_id-1], | |
| json_file["answer"][problem_id-1], | |
| numberic_compare, | |
| check_equal | |
| ) | |
| return gr.update(visible=True), gr.update(value=res_to_str(ppl_correct, ppl_answers)), gr.update(value=res_to_str(sc_correct, sc_answers)), gr.update(value=res_to_str(rpc_correct, rpc_answers)) | |
| load_btn.click(fn=load, inputs=[dataset, model, k_value, seed],outputs=[load_btn, content_column, data_info, problem_id, result_column], show_progress="inside") | |
| run_btn.click(fn=evaluate, inputs=problem_id, outputs=[result_column, ppl_result, sc_result, rpc_result]) | |
| if __name__ == "__main__": | |
| demo.launch() |