About the author:
Daniel is CTO at rhome GmbH, and Co-Founder at Aqarios GmbH. He holds a M.Sc. in Computer Science from LMU Munich, and has published papers in reinforcement learning and quantum computing. He writes about technical topics in quantum computing and startups.
jrnl · home about list ventures publications LinkedIn Join my Slack

# Reliable structured extraction of descriptions with GPT and Pydantic

Diving straight into the the matter, we're looking at a high-powered, AI-driven approach to extracting technology requirements from project descriptions. This method is particularly potent in the fast-paced freelance IT market, where pinpointing exact requirements quickly can make or break your success. Here’s how it’s done.

Firstly, let’s talk about Pydantic. It’s the backbone of structuring the sometimes erratic outputs from GPT. Pydantic's role is akin to a translator, making sense of what GPT spits out, regardless of its initial structure. This is crucial because, let's face it, GPT can be a bit of a wildcard.

Consider this Pydantic model:

from pydantic import BaseModel, Field

class Requirements(BaseModel):
    names: list[str] = Field(
        ..., 
        description="Technological requirements from the job description."
    )

It’s straightforward yet powerful. It ensures that whatever GPT-4 returns, we mold it into a structured format – a list of strings, each string being a specific technology requirement.

Now, onto the exciting part – interfacing with GPT-4. This is where we extract the gold from the mine.

import openai

class RequirementExtractor:
    def __init__(self, project_id: int):
        ...
        self.project: Project = Project.query.get(project_id)
        self.openai_client = openai.OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))

    def _extract_requirements(self, description: str) -> Requirements:
        ...

In this snippet, the RequirementExtractor initializes with a project object. The real action happens in _extract_requirements. This method calls upon GPT-4 to analyze the project description and extract technology requirements.

The extraction process is where things get interesting. It's not just about firing off a request to GPT-4 and calling it a day. There's an art to it.

def _extract_requirements(self, description: str) -> Requirements:
    response = self.openai_client.chat.completions.create(
        model="gpt-4",
        response_model=Requirements,
        messages=[
            {"role": "system", "content": "Extract technology requirements."},
            {"role": "user", "content": description}
        ],
    )
    return response

We send the project description to GPT-4 with a specific prompt to extract technology requirements. It’s precise and to the point. The response is then funneled through our Pydantic model to keep it structured.

Accuracy is key, and that’s where iterative refinement comes in. We don't settle for the first output. We iterate to refine and ensure comprehensiveness.

def extract(self) -> list[str]:
    ...
    while retries_left > 0 and total_retries < self.MAX_RETRIES:
        response = self._extract_requirements(self.project.description)
        ...
        total_retries += 1
    ...

This loop keeps the process going, refining and adjusting until we have a complete and accurate set of requirements.

The final touch is grouping similar technologies. It’s about making sense of the list we’ve got, organizing it into clusters for easier interpretation and application.

def group(self, requirements: list[str]) -> GroupedRequirements:
    ...
    return self.openai_client.chat.completions.create(
        model="gpt-4",
        response_model=GroupedRequirements,
        messages=[
            ...
        ],
    )

In this function, we again leverage GPT-4’s prowess, but this time to group similar technologies, adding an extra layer of organization to our extracted data.

In the German freelance IT market, speed and precision are paramount. Imagine applying this method to a project posting for a Senior Fullstack Developer. You get an accurate, well-structured list of requirements like AWS, React, and domain-driven design in minutes. This is crucial for staying ahead in a market where projects are grabbed as soon as they appear.

Harnessing GPT and Pydantic for requirement extraction is more than a convenience – it’s a strategic advantage. It’s about extracting the right info, structuring it for practical use, and doing it all at lightning speed. This approach isn’t just smart; it’s essential for anyone looking to dominate in the competitive, fast-paced world of IT freelancing.

Published on