[Python] Constrain Llama3.2-vision output to a list of options

Discussão em 'Python' iniciado por Stack, Março 28, 2025.

  1. Stack

    Stack Membro Participativo

    I have several images of animals in the same directory as the script. How can I modify the following script to process an image but force the output to only be a single selection from a list:

    from pathlib import Path
    import base64
    import requests

    def encode_image_to_base64(image_path):
    """Convert an image file to base64 string."""
    return base64.b64encode(image_path.read_bytes()).decode('utf-8')

    def extract_text_from_image(image_path):
    """Send image to local Llama API and get text description."""
    base64_image = encode_image_to_base64(image_path)

    payload = {
    "model": "llama3.2-vision",
    "stream": False,
    "messages": [
    {
    "role": "user",
    "content": (
    "With just one word, classify this image into one of these exact categories:\n"
    "- dog\n"
    "- cat\n"
    "- butterfly\n"
    ),
    "images": [base64_image]
    }
    ]
    }

    response = requests.post(
    "http://localhost:11434/api/chat",
    json=payload,
    headers={"Content-Type": "application/json"}
    )

    return response.json().get('message', {}).get('content', 'No text extracted')

    def process_directory():
    """Process all images in current directory and create text files."""
    for image_path in Path('.').glob('*'):
    if image_path.suffix.lower() in {'.png', '.jpg', '.jpeg', '.gif', '.bmp', '.webp'}:
    print(f"\nProcessing {image_path}...")

    text = extract_text_from_image(image_path)
    image_path.with_suffix('.txt').write_text(text, encoding='utf-8')
    print(f"Created {image_path.with_suffix('.txt')}")

    process_directory()


    However, despite different prompt engineering, I get some answers that will do more than just select from a list. For example, it may occassionally output "From the image, there is a winged insect, therefore my guess is "butterfly." ANSWER: Butterfly." If I define the list as allowed_options = ['dog', 'cat', 'butterfly'] I only want it to output a single string from that list and nothing else.

    Continue reading...

Compartilhe esta Página