MOPC-App/docs/architecture/ai-prompts.md

5.3 KiB

AI Prompts Reference

This document describes the prompts used by each AI service. All prompts are optimized for token efficiency while maintaining accuracy.

Design Principles

  1. Concise system prompts - Under 100 tokens where possible
  2. Structured output - JSON format for reliable parsing
  3. Clear field names - Consistent naming across services
  4. Score ranges - 0-1 for confidence, 1-10 for quality

Filtering Prompt

Purpose: Evaluate projects against admin-defined criteria

System Prompt

Project screening assistant. Evaluate each project against the criteria.
Return JSON: {"projects": [{project_id, meets_criteria: bool, confidence: 0-1, reasoning: str, quality_score: 1-10, spam_risk: bool}]}
Assess description quality and relevance objectively.

User Prompt Template

CRITERIA: {criteria_text}
PROJECTS: {anonymized_project_array}
Evaluate each project against the criteria. Return JSON.

Example Response

{
  "projects": [
    {
      "project_id": "P1",
      "meets_criteria": true,
      "confidence": 0.9,
      "reasoning": "Project focuses on coral reef restoration, matching ocean conservation criteria",
      "quality_score": 8,
      "spam_risk": false
    }
  ]
}

Assignment Prompt

Purpose: Match jurors to projects by expertise

System Prompt

Match jurors to projects by expertise. Return JSON assignments.
Each: {juror_id, project_id, confidence_score: 0-1, expertise_match_score: 0-1, reasoning: str (1-2 sentences)}
Distribute workload fairly. Avoid assigning jurors at capacity.

User Prompt Template

JURORS: {anonymized_juror_array}
PROJECTS: {anonymized_project_array}
CONSTRAINTS: {N} reviews/project, max {M}/juror
EXISTING: {existing_assignments}
Return JSON: {"assignments": [...]}

Example Response

{
  "assignments": [
    {
      "juror_id": "juror_001",
      "project_id": "project_005",
      "confidence_score": 0.85,
      "expertise_match_score": 0.9,
      "reasoning": "Juror expertise in marine biology aligns with coral restoration project"
    }
  ]
}

Award Eligibility Prompt

Purpose: Determine project eligibility for special awards

System Prompt

Award eligibility evaluator. Evaluate projects against criteria, return JSON.
Format: {"evaluations": [{project_id, eligible: bool, confidence: 0-1, reasoning: str}]}
Be objective. Base evaluation only on provided data. No personal identifiers in reasoning.

User Prompt Template

CRITERIA: {criteria_text}
PROJECTS: {anonymized_project_array}
Evaluate eligibility for each project.

Example Response

{
  "evaluations": [
    {
      "project_id": "P3",
      "eligible": true,
      "confidence": 0.95,
      "reasoning": "Project is based in Italy and focuses on Mediterranean biodiversity"
    }
  ]
}

Mentor Matching Prompt

Purpose: Recommend mentors for projects

System Prompt

Match mentors to projects by expertise. Return JSON.
Format for each project: {"matches": [{project_id, mentor_matches: [{mentor_index, confidence_score: 0-1, expertise_match_score: 0-1, reasoning: str}]}]}
Rank by suitability. Consider expertise alignment and availability.

User Prompt Template

PROJECTS:
P1: Category=STARTUP, Issue=HABITAT_RESTORATION, Tags=[coral, reef], Desc=Project description...
P2: ...

MENTORS:
0: Expertise=[marine biology, coral], Availability=2/5
1: Expertise=[business development], Availability=0/3
...

For each project, rank top {N} mentors.

Example Response

{
  "matches": [
    {
      "project_id": "P1",
      "mentor_matches": [
        {
          "mentor_index": 0,
          "confidence_score": 0.92,
          "expertise_match_score": 0.95,
          "reasoning": "Marine biology expertise directly matches coral restoration focus"
        }
      ]
    }
  ]
}

Anonymized Data Structure

All projects sent to AI use this structure:

interface AnonymizedProjectForAI {
  project_id: string        // P1, P2, etc.
  title: string             // Sanitized (PII removed)
  description: string       // Truncated + PII stripped
  category: string | null   // STARTUP | BUSINESS_CONCEPT
  ocean_issue: string | null
  country: string | null
  region: string | null
  institution: string | null
  tags: string[]
  founded_year: number | null
  team_size: number
  has_description: boolean
  file_count: number
  file_types: string[]
  wants_mentorship: boolean
  submission_source: string
  submitted_date: string | null // YYYY-MM-DD
}

What Gets Stripped

  • Team/company names
  • Email addresses
  • Phone numbers
  • External URLs
  • Real project/user IDs
  • Internal comments

Token Optimization Tips

  1. Batch projects - Process 15-20 per request
  2. Truncate descriptions - 300-500 chars based on task
  3. Use abbreviated fields - desc vs description
  4. Compress constraints - Inline in prompt
  5. Request specific fields - Only what you need

Prompt Versioning

Service Version Last Updated
Filtering 2.0 2025-01
Assignment 2.0 2025-01
Award Eligibility 2.0 2025-01
Mentor Matching 2.0 2025-01

See Also