# 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 käymme läpi monia esimerkkejä siitä, miten ChatGPT:tä voidaan käyttää koodin generointiin.

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

Kuten kaikissa OpenAI:n chat-malleissa, voit käyttää `järjestelmäviestiä` määrittelemään vastausten käyttäytymisen ja formaatin. Käytämme seuraavaa järjestelmäviestiä kehote-esimerkeissä:

```
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 on ohjeet halutun koodin generoimiseksi mallilla. Alla on kuva ensimmäisestä peruskehote-esimerkistä. Huomaa, että lopullinen koodi generoitiin `koodiavustajan` toimesta.

<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 käyttää näiden LLM:ien koodin generointikykyä luomaan koodia vain kommenteista. Katsotaan toista esimerkkiä, joka antaa ohjeet 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 generoivat toimivaa koodia, sinun on kiinnitettävä huomiota pieniin yksityiskohtiin, kuten tähän, ja aina varmistettava koodin testaaminen.

## Funktion Täydentäminen

Nämä LLM:t on myös osana työkaluja, kuten GitHub Copilot, mikä tekee niistä hyödyllisiä kehittäjille. Yksi 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 generointiesimerkin lisäksi voit käyttää mallia hyödyllisen koodin generointiin, jota voidaan käyttää ohjelmoinnin muissa osa-alueissa, kuten luomalla ja testaamalla MySQL-kyselyitä.

Oletetaan, että sinulla on tietojoukko, jossa on joitakin tietoja, jotka voit sisällyttää kehotteeseen ja sitten ohjeistaa sen generoimaan tietyn kyselyn. 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 tietokantaa, jossa testata generoitua kyselyä. Jos testaat tätä esimerkkiä, voi olla hyödyllistä luoda tämä tietokanta. Onneksi voit käyttää ChatGPT:tä myös tämän luomiseen. Yksi lähestymistapa on käyttää muokattua versiota yllä olevasta kehotteesta hieman erilaisilla ohjeilla tietokantaskeeman generoimiseen:

```
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 valittaa, että se on koodiavustaja Pythonissa, mutta se silti tarjoaa selityksen. Joskus malli kieltäytyy tuottamasta sitä, mitä ohjeistat, 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 valitsee tietojenkäsittelytieteen opiskelijoiden nimet ja tunnukset.
```

## Koodin Muokkaaminen
Esimerkki tulossa pian!

## Koodin Virheenkorjaus
Esimerkki tulossa pian!

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