Generując kod z użyciem AI warto zawsze mieć podejście krytyczne. Upewnić się że kod ma sens ale i czy nie posiada również luk bądź błędów. W dzisiejszym artykule pokażę Ci w jaki sposób można to zautomatyzować z użyciem drugiego modelu oceniającego. Skorzystamy z biblioteki pydantic oraz instructor.
Schemat działania naszego programu:
Jeden model tworzy kod w oparciu o nasz prompt.
Drugi model sprawdza go, ocenia i daje szczegółowe sugestie poprawek.
*Oczywiście nie zastąpi to krytycznego myślenia. Ma to za zadanie tylko nas wspomóc w nauce, celem zwiększenia świadomości i pomocy w wskazaniu potencjalnych błędów.
1. Przygotowanie środowiska
W naszym przykładzie skorzystamy z w pełni z środowiska które będzie działało w pełni offline. Pomoże to nam zachować prywatność podczas tworzenia rozwiązań.
Najpierw upewnij się, że masz zainstalowane wszystkie potrzebne biblioteki.
pip install openai instructor pydantic
Sprawdź również czy twój lokalny serwer (serwujący modele) jest uruchomiony, np. Ollama, i nasłuchuje na porcie 11434.
Dodatkowo zaimportuj wymagane biblioteki.
from openai import OpenAI
from pydantic import BaseModel, Field
import instructor
2. Generowanie kodu
Zaczynamy od stworzenia modelu w który będzie przechowywał nasz kod wraz z opisem jego działania i wybranym przez nas językiem programowania.
class GeneratedCode(BaseModel):
code: str = Field(..., description="Kod wygenerowany przez pierwszy model")
language: str = Field(..., description="Język programowania, w którym wygenerowano kod")
description: str = Field(..., description="Krótki opis działania wygenerowanego kodu")
Nastepnie konfigurujemy naszego klienta AI do generowania kodu tak by zwracał dane w formacie JSON:
client_generator = instructor.from_openai(
OpenAI(
base_url="http://localhost:11434/v1",
api_key="asd", # możemy podać dowolny
),
mode=instructor.Mode.JSON,
)
Możemy teraz przejść do przekazania naszego modelu i wygenerowania kodu za pomocą funkcji:
generated_code = client_generator.chat.completions.create(
model="gemma3:12b",
messages=[{
"role": "user",
"content": "Wygeneruj kod w pythonie z użyciem flaska którego celem jest stworzenie prostego api do zwracania daty i godziny",
}],
response_model=GeneratedCode,
)
Efekt? Otrzymujemy kod Pythona w formacie JSON, gotowy do użycia. Sprawdźmy teraz czy napewno jest zgodny z najlepszymi praktykam.
print(generated_code.model_dump_json(indent=2))
3. Ocena kodu i propozycje poprawek
Tworzymy teraz modele danych, opisujące ocenę i listujące poprawki:
from typing import List
class Correction(BaseModel):
description: str = Field(..., description="Szczegółowy opis poprawki do kodu")
suggested_change: str = Field(..., description="Proponowana zmiana w kodzie")
class Evaluation(BaseModel):
score: int = Field(..., ge=1, le=10, description="Ocena od 1 do 10")
reasoning: str = Field(..., description="Uzasadnienie oceny")
corrections: List[Correction] = Field(..., description="Lista poprawek do wygenerowanego kodu")
*Można się pokusić o dodanie do prompta kolejnych sekcji np związanych z oceną bezpieczeństwa kodu. Potraktuj to jako wyzwanie :)
Teraz czas na naszego drugiego klienta — tym razem do oceny kodu:
client_evaluator = instructor.from_openai(
OpenAI(
base_url="http://localhost:11434/v1",
api_key="asd", # możemy podać dowolny
),
mode=instructor.Mode.JSON,
)
Czas na wykorzystanie modelu llama3 do jego oceny.
evaluation = client_evaluator.chat.completions.create(
model="llama3", # Tu zmieniliśmy nasz model na inny
messages=[{
"role": "user",
"content": f"Oceń poniższy wygenerowany kod i zaproponuj poprawki, jeśli są potrzebne:\n\n{generated_code.code}"
}],
response_model=Evaluation,
)
Sprawdźmy efekt naszego sprawdzenia.
print(evaluation.model_dump_json(indent=2))
Uwagi
Ciekawostką jest to że w przypadku wywołania drugiego modelu, ollama usuwa pierwszy z pamięci mimo dużej ilości wolnego ramu. Jest to bardzo niefektowne podejście, które powoduje również większe zużycie naszego dysku ssd jak i dłuższy czas oczekiwania na odpowiedź.
Zalecam uruchomienie wiekszej ilości instancji ollamy, bądź wykorzystanie drugiego modelu serwowanego z chmury. Można też spróbować wykorzystać paramet keep_alive ale to już materiał na kolejną część ze względu na brak oficjalnego wsparcia.
Komentarze