LoRA adapter for extracting structured funding metadata (funder names + award IDs) from academic paper funding statements. Fine-tuned on Llama 3.1 8B Instruct via SFT then GRPO reinforcement learning.
1from peft import PeftModel
2from transformers import AutoModelForCausalLM, AutoTokenizer
3
4base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
5model = PeftModel.from_pretrained(base_model, "adambuttrick/funding-extraction-llama-3.1-8b-instruct-grpo-stepfinal")
6tokenizer = AutoTokenizer.from_pretrained("adambuttrick/funding-extraction-llama-3.1-8b-instruct-grpo-stepfinal")
7
8prompt = """Extract funding information from the following statement:
9
10This work was supported by the National Science Foundation under grant DMS-1613002 and by the NIH (R01-AI123456)."""
11
12messages = [
13 {"role": "system", "content": "You are an expert at extracting structured funding metadata from academic papers. Given a funding statement, extract all funders and their associated awards. Return a JSON array of funder objects. Each funder has:\n- \"funder_name\": string or null\n- \"awards\": array of objects with \"award_ids\" (array of strings), \"funding_scheme\" (array of strings), and \"award_title\" (array of strings)\nReturn ONLY the JSON array, no other text."},
14 {"role": "user", "content": prompt},
15]
16
17inputs = tokenizer.apply_chat_template(messages, return_tensors="pt", add_generation_prompt=True)
18outputs = model.generate(inputs, max_new_tokens=512, temperature=0.0, do_sample=False)
19print(tokenizer.decode(outputs[0][inputs.shape[-1]:], skip_special_tokens=True))
1[
2 {
3 "funder_name": "National Science Foundation",
4 "awards": [
5 {
6 "award_ids": ["DMS-1613002"],
7 "funding_scheme": [],
8 "award_title": []
9 }
10 ]
11 },
12 {
13 "funder_name": "NIH",
14 "awards": [
15 {
16 "award_ids": ["R01-AI123456"],
17 "funding_scheme": [],
18 "award_title": []
19 }
20 ]
21 }
22]