File size: 2,382 Bytes
a0270e2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Prompt construction utilities for Autoregressive JSON Generation
vs. Parallel Constrained Decision Batches.
"""

from typing import Dict, Any, List, Tuple
from core.schema import StructuredSchema, FieldDefinition


def build_naive_json_prompt(context: str, schema: StructuredSchema) -> str:
    """
    Builds the baseline prompt instructing the model to generate a full JSON document.
    """
    schema_prompt = schema.to_json_schema_prompt_str()
    prompt = (
        f"<|im_start|>system\n"
        f"You are a precise data extraction system. You must output ONLY a valid, beautifully formatted, indented JSON object with newlines and 2-space indentation matching the schema below. Do not output a single-line string. Do not include markdown tags.\n\n"
        f"JSON Schema:\n{schema_prompt}<|im_end|>\n"
        f"<|im_start|>user\n"
        f"Analyze the following context and generate the required formatted JSON object:\n\n{context}<|im_end|>\n"
        f"<|im_start|>assistant\n{{\n  "
    )
    return prompt


def build_parallel_field_prompts(context: str, schema: StructuredSchema) -> List[Tuple[str, FieldDefinition, str]]:
    """
    Builds discrete single-decision prompts for each field in the schema.
    Returns a list of (field_name, field_def, prompt_text).
    """
    prompts = []
    for field_name, field_def in schema.fields.items():
        if field_def.field_type == "boolean":
            options_text = "true, false"
        else:
            if len(field_def.choices) <= 20:
                options_text = ", ".join(field_def.choices)
            else:
                sample = ", ".join(field_def.choices[:8])
                options_text = f"{sample}, ... [{len(field_def.choices)} total options]"

        prompt = (
            f"<|im_start|>system\n"
            f"You are a calibrated decision engine. Select the single most accurate option based on evidence.<|im_end|>\n"
            f"<|im_start|>user\n"
            f"{context}\n\n"
            f"Field: {field_name}\n"
            f"Description: {field_def.description}\n"
            f"Allowed choices: {options_text}\n"
            f"Exact choice:<|im_end|>\n"
            f"<|im_start|>assistant\n"
        )
        prompts.append((field_name, field_def, prompt))
        
    return prompts


# Backward compatibility alias
build_rlcd_field_prompts = build_parallel_field_prompts