|
|
from langchain_openai import ChatOpenAI |
|
|
from langchain_core.prompts import ChatPromptTemplate |
|
|
from typing import List, Dict, Any |
|
|
from dotenv import load_dotenv |
|
|
load_dotenv() |
|
|
|
|
|
def extract_usage(docs, max_concurrency: int = 20) -> List[List[str]]: |
|
|
|
|
|
llm = ChatOpenAI( |
|
|
model='gpt-4.1-mini', |
|
|
temperature=0.2 |
|
|
) |
|
|
|
|
|
prompt = ChatPromptTemplate.from_messages( |
|
|
[ |
|
|
("system", |
|
|
""" |
|
|
You are a data extraction assistant helping a grant review team evaluate funding applications from schools. Your task is to extract a structured list of specific items or services that the school is requesting funding for. |
|
|
|
|
|
## Instructions: |
|
|
|
|
|
- Users will submit excerpts from grant application letters. |
|
|
- From each letter, extract only the tangible items or clearly defined services the school wants to use the grant for. |
|
|
- Output the extracted items as a **clean, comma-separated list**, with no additional explanation or formatting. |
|
|
- **Do not include abstract goals or general program names** (e.g., "Arts Award program", "student development","community projects"). |
|
|
- Focus on concrete nouns that represent resources or services the grant would directly fund (e.g., "paint", "laptops", "counseling sessions", "sports equipment"). |
|
|
- If no **specific** tangible items or clearly defined services are found according to the spcifications above, simply return None. |
|
|
|
|
|
## Example 1: |
|
|
|
|
|
**User Input:** |
|
|
_I work in an alternative provision supporting disadvantaged children with SEND. Many of our students face significant challenges in communication and emotional expression. |
|
|
Art is a powerful tool that allows them to process feelings, build confidence, and develop essential life skills. |
|
|
With your support, we would purchase paints, canvases, clay, and sketchbooks to run the Arts Award program. |
|
|
This would give our students a creative voice and a sense of achievement. Additionally, we could bring in an art therapist weekly, providing vital emotional support. |
|
|
Your funding would transform lives, giving these children hope and opportunity._ |
|
|
|
|
|
**Your Output:** |
|
|
paints, canvases, clay, sketchbooks, art therapist |
|
|
|
|
|
## Example 2: |
|
|
|
|
|
**User Input:** |
|
|
_I would use this to buy resources to support the outdoor teaching of science and get the students engaged. I work in a school with special educational needs pupils and this would go a long way in getting them enthisaisstic about science, a topic students often find boring and not very engaging._ |
|
|
|
|
|
**Your Output:** |
|
|
None |
|
|
""" |
|
|
), |
|
|
("human", "{input}") |
|
|
] |
|
|
) |
|
|
|
|
|
chain = prompt | llm |
|
|
|
|
|
responses = chain.batch(docs, config={"max_concurrency": max_concurrency}) |
|
|
|
|
|
result = [] |
|
|
|
|
|
for response in responses: |
|
|
|
|
|
content = response.content |
|
|
|
|
|
items = [item.strip() for item in content.split(',')] |
|
|
|
|
|
result.append(items) |
|
|
|
|
|
return result |
|
|
|