# Koodin Generointi

import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import CODE1 from '../../img/code-generation/chat-mode.png'

<Callout emoji="⚠️">
  Tämä osio kehittyy jatkuvasti.
</Callout>

Suuret kielimallit, kuten ChatGPT, ovat erittäin tehokkaita koodin generoinnissa. Tässä osiossa esittelemme useita esimerkkejä siitä, kuinka ChatGPT:tä voidaan hyödyntää koodin generointiin.

Kaikki alla esitetyt esimerkit käyttävät OpenAI:n testiympäristöä (playground) Chat Mode-tilassa ja `gpt-3.5-turbo`-mallia.

Kuten kaikissa OpenAI:n chat-malleissa, voit määrittää vastauksien käyttäytymisen ja muodon `järjestelmäviestin` avulla. Käytämme seuraavaa järjestelmäviestiä kehote-esimerkeissämme:

```
Olet koodiavustaja, joka opettaa juniorikehittäjälle koodaamista. Käyttämäsi kieli on Python. Älä selitä koodia, vaan luo vain koodilohko itsessään.
```

## Perusesimerkki

`Käyttäjän viesti` sisältää kehotteen, jossa annetaan ohjeet halutun koodin generoimiseksi mallilla. Alla on esimerkki ensimmäisestä peruskehoteesta. Huomaa, että lopullisen koodin generoi `koodiavustaja`.

<Screenshot src={CODE1} alt="CODE1" />

Tässä kehote, jos haluat kokeilla itse:

```
Kirjoita koodia, joka kysyy käyttäjän nimen ja sanoo "Hei"
```

## Muuta Kommentit Koodiksi

Voit myös hyödyntää LLM:ien kykyä generoida koodia suoraan kommenteista. Katsotaan toista esimerkkiä, jossa ohjeet annetaan kommenttina:

*Kehote:*
```
"""
1. Luo lista elokuvista
2. Luo lista näiden elokuvien arvioinneista
3. Yhdistä ne luodaksesi json-objektin, joka sisältää 10 elokuvaa ja niiden arvioinnit.
"""
```

*Tulos:*
```python
elokuvat = ["The Shawshank Redemption", "The Godfather", "The Dark Knight", "Schindler's List", "Pulp Fiction", "The Lord of the Rings: The Return of the King", "Forrest Gump", "Star Wars: Episode V - The Empire Strikes Back", "Inception", "The Silence of the Lambs"]

arvioinnit = [9.3, 9.2, 9.0, 8.9, 8.9, 8.9, 8.8, 8.7, 8.7, 8.6]

elokuva_arvioinnit = {}

for i in range(len(elokuvat)):
    elokuva_arvioinnit[elokuvat[i]] = arvioinnit[i]

json_objekti = json.dumps(elokuva_arvioinnit, indent=4)

print(json_objekti)
```

Generoitu koodi näyttää toimivalta koodilta. Kuitenkin tulosteesta puuttuu tärkeä `import`-lause, eli `import json`. Vaikka nämä mallit pystyvät generoimaan toimivaa koodia, on tärkeää kiinnittää huomiota pieniin yksityiskohtiin, kuten tähän, ja aina varmistaa koodin toimivuus testaamalla.

## Funktion Täydentäminen

Nämä LLM:t ovat osana työkaluja, kuten GitHub Copilot, mikä tekee niistä hyödyllisiä kehittäjille. Eräs hyödyllinen ominaisuus on mallin kyky täydentää funktioita.

*Kehote:*
```python
# funktio, joka kertoo kaksi lukua keskenään ja lisää siihen 75

def multiply(
```

*Tulos:*
```python
a, b):
    tulos = a * b
    tulos += 75
    return tulos
```

## MySQL-kyselyiden Generointi

Perustason koodin generointiesimerkkien lisäksi voit hyödyntää mallia monimutkaisemman koodin generoimiseen, jota voidaan käyttää ohjelmoinnin eri osa-alueissa, esimerkiksi luomalla ja testaamalla MySQL-kyselyitä.

Oletetaan, että sinulla on tietojoukko, joka sisältää joitakin tietoja. Voit sisällyttää nämä tiedot kehotteeseen ja antaa ohjeet tietyn kyselyn generoimiseksi. Esimerkiksi:

```
"""
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
Luo MySQL-kysely kaikille tietojenkäsittelytieteen opiskelijoille
"""
```

*Tulos:*
```
SELECT s.StudentId, s.StudentName
FROM students s
JOIN departments d ON s.DepartmentId = d.DepartmentId
WHERE d.DepartmentName = 'tietojenkäsittelytiede';

Tämä kysely yhdistää departments- ja students-taulut niiden yhteisen DepartmentId-sarakkeen perusteella ja hakee ne opiskelijat, joiden osaston nimi (DepartmentName) on 'tietojenkäsittelytiede'.
```

"Malli luo kyselyn! Tässä esimerkissä keksimme tietokannan, joten meillä ei ole oikeaa tietokantaa, jossa voimme testata generoitua kyselyä. Jos haluat testata tätä esimerkkiä, sinun voi olla hyödyllistä luoda tämä tietokanta. Onneksi voit käyttää ChatGPT:tä myös tämän luomiseen. Yksi lähestymistapa on muokata yllä olevaa kehotetta hieman erilaisilla ohjeilla tietokantaskeeman generoimiseksi:

```
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
Luo tietokantaskeema yllä olevilla taulukoilla ja sarakkeilla
```

Malli generoi seuraavan skeeman:

```
CREATE TABLE departments (
    DepartmentId INT PRIMARY KEY,
    DepartmentName VARCHAR(255) NOT NULL
);

CREATE TABLE students (
    StudentId INT PRIMARY KEY,
    StudentName VARCHAR(255) NOT NULL,
    DepartmentId INT,
    FOREIGN KEY (DepartmentId) REFERENCES departments (DepartmentId)
);
```

Voit luoda väliaikaisen tietokannan käyttämällä palveluja kuten [sqliteonline.com](https://sqliteonline.com/).

Tarvitset myös sisältöä jotta voit testata, oliko alkuperäinen generoitu kysely kelvollinen. Käytetään ChatGPT:tä tähänkin! Kehote voi näyttää esimerkiksi tälle:

```
CREATE TABLE departments (
  DepartmentId INT PRIMARY KEY,
  DepartmentName VARCHAR(50)
);

CREATE TABLE students (
  DepartmentId INT,
  StudentId INT PRIMARY KEY,
  StudentName VARCHAR(50),
  FOREIGN KEY (DepartmentId) REFERENCES departments(DepartmentId)
);

Olettaen yllä oleva tietokantaskeema, generoi kelvolliset INSERT-lauseet, joihin sisältyy 4 riviä kummallekin taululle.
```

Tulos INSERT-lauseilla:

```
INSERT INTO departments (DepartmentId, DepartmentName) VALUES
(1, 'Tietojenkäsittelytiede'),
(2, 'Matematiikka'),
(3, 'Fysiikka'),
(4, 'Kemia');

INSERT INTO students (DepartmentId, StudentId, StudentName) VALUES
(1, 1001, 'Aino Aaltonen'),
(2, 1002, 'Bertta Bäckström'),
(1, 1003, 'Cecilia Carlsson'),
(3, 1004, 'David Dahl');
```

Nyt kun sinulla on tietokanta ja testitietoja, voit testata alkuperäisen kyselyn toimivuuden. Testitietojen perusteella tuloksen pitäisi olla kaksi riviä, joissa ovat Aino Aaltonen ja Cecilia Carlsson.

## Koodin Selittäminen
Jos opettelet ohjelmoimaan tietyllä kielellä, voi olla hyödyllistä pyytää mallia selittämään tiettyjä koodin osia. Käytetään uudelleen yllä luotua kyselyä ja pyydetään mallia selittämään se.

Jos käytät samaa järjestelmäviestiä kuin aiemmin, ole varovainen ohjeiden antamisessa mallille. Esimerkiksi, jos käytämme seuraavaa esimerkkiä, malli huomauttaa, että se on koodiavustaja Pythonissa, mutta se tarjoaa silti selityksen. Joskus malli saattaa kieltäytyä tuottamasta pyydettyä sisältöä, koska se on suunniteltu noudattamaan järjestelmäviestiä.

*Kehote:*

```
SELECT students.StudentId, students.StudentName
FROM students
INNER JOIN departments
ON students.DepartmentId = departments.DepartmentId
WHERE departments.DepartmentName = 'Computer Science';

Selitä yllä oleva SQL-lause.
```

*Tulos:*

```
Tämä SQL-lause valitsee StudentId ja StudentName sarakkeet students taulusta, missä DepartmentName sarake departments taulussa on yhtä suuri kuin 'Tietojenkäsittelytiede'. Saavuttaakseen tämän, lause suorittaa sisäisen liitoksen DepartmentId sarakkeen välillä students ja departments tauluissa.

Yksinkertaisemmin sanottuna, se hakee tietojenkäsittelytieteen opiskelijoiden nimet ja tunnukset.
```

## Koodin Muokkaaminen
Esimerkki tulossa pian!

## Koodin Virheenkorjaus
Esimerkki tulossa pian!

## Parhaat Käytännöt
Tulossa pian!