# Zadanie 1

https://griesshaber.pages.mi.hdm-stuttgart.de/nlp/04ngram/01ngram.html
# Zadanie 2

**Dlaczego miałoby działać?**
Intucyjnie wydaje się, że model będzie radził sobie gorzej niż człowiek, więc prawdopodobnie będzie miał mniejsze perplexity. (będzie gorzej pamiętał odległe framgmenty tekstu niż człowiek)
Jeżeli licząc perpelxity sposobem z n-gramami n jest większe niż długość kontekstu modelu, to znaczy, że perplexity bardziej doceni człowieka, który bierze pod uwagę większy fragment tekstu niż model.
**Dlaczego intuicja jest błędna**
* Ludzie popełniają błędy i literówki w tekście
* Duże modele językowe jak np. Chatgpt maja dużo niższe perplexity niż słabsze jak np. Polka
* Możemy zmniejszyć temperature lub Top-K sampling, aby zmniejszyć perpelxity
* Poprawa spójności w dłuższych tekstach: Użytkownik może prosić model o powtarzanie kluczowych informacji lub struktur zdań, co podnosi spójność w tekście i obniża jego perplexity.
---
Złożoność języka naturalnego: Naturalne teksty mogą być bardzo różnorodne. Teksty pisane przez ludzi nie zawsze mają niskie perplexity, ponieważ zawierają błędy, lokalne idiomy, neologizmy lub rzadko używane słowa, co również może podnosić perplexity.
Zróżnicowanie modeli: Modele językowe różnią się od siebie sposobem generowania tekstu. Tekst wygenerowany przez bardziej zaawansowany model, np. ChatGPT, może mieć niższe perplexity, ponieważ model ten jest zdolny generować bardziej naturalne i spójne odpowiedzi. Z kolei starsze modele lub modele o mniejszej liczbie parametrów mogą produkować teksty o wyższym perplexity, nawet jeśli są to teksty naturalne.
Manipulacja wartości perplexity: https://hackmd.io/_uploads/B1riRczZkx.png
# Zadanie 3

a)
1) ustaw k-ty wyraz
2) generuj od niego na prawo (łatwe)
3) generuj od niego w lewo (?)
I want chinese food
normalny wzorek:

odwrócony wzorek:
Ala ma kota.
Kota ma Ala.
b)
2-gramy:
[Ala (x] kota)
3-gramy
_, x, _
x, _, x
[_, (_, x], _)
Na szansę na x wpływa jak dobrze pasuje _ _ X w trzygramach i _ X orax X _ w dwugramach
c)
[Ala, ..., ... , ,kota]
[Ala, , ... , ... ,kota]
[Ala, , , , , ,kota]
bardzo Wolny ale dobry:
```
for dlugosc ... 20
for pos 2...dlugosc-1
wygeneruj slowo
sprawdz perplexity
```
wolny ale mniej dobry:
```
for pos 2...dlugosc-1
wygeneruj slowo
sprawdz perplexity
```
d)
Możemy wykorzystać podpunkt c) aby wygenrować wyrazy w taki sposób, aby pierwszym tokenem był ostatni token z poprzedniego wyrazu + spacja, a ostatim suffiks.
(jeżeli spacja jest na początku tokenów w naszym tokenizerze to wyszukujemy takich tokenów na drugiej pozycji, aby miały na początku spacje).
# Zadanie 4

Dzięki temu że mamy wytrenowany model w obu kierunkach możemy teraz zastosować sposoby z zadania trzeciego, aby móc generować zdania, które mają np. dany wyraz na konkretnej pozycji lub dany suffix.
(Możemy generować wiersze z rymami - jeżeli token to byłaby litera)
# Zadanie 5


`Kamila kradnie kapcie...`
a - 20
b - 21
c - 22
Kroki:
1) Kodujemy tekst za pomocą klucza publicznego RSA
2) Tworzymy tekst w taki sposób, aby pierwsza litera każdego słowa/zdania to była kolejna litera z zaszyfrowanego ciągu
3) Przekazujemy wiadomość
4) Druga osoba wybiera pierwsze litery i następnie odszyfrowuje RSA
# Zadanie 6

Zasada Kerckhoffsa Bezpieczeństwo kryptosystemu powinno zależeć wyłącznie od tajności jego klucza, natomiast powinno być niezależne od zachowania tajności jakiejkolwiek innej części kryptosystemu, takiej jak: algorytm szyfrowania, kanał przesyłania wiadomości, urządzenie szyfrujące / deszyfrujące.
TAK
# Zadanie 7

* Zamiast pisać wyrazu piszemy na której pozycji od najbardziej prawdopodobnych znajduje się on według papugi. Jeżeli pozycja ta jest za duża, to piszemy wyraz ręcznie.
* GORSZE: Ustawimy Top P na 1 i temperature na 0.
Jeżeli w tekście, który chcemy zakodować kolejny wyraz jest taki sam jaki wygenerowała by papuga to do numerka poprzedniego wyrazu dodajemy 1.
# Zadanie 8

Papuga została wytrenowana z użyciem tokenizera, który zawiera spację na początku tokenów. Z tego powodu jeżeli na końcu prompta damy spację to model będzie musiał dać jakiś dziwny token na koniec prompta, która zaburzy perplexity. Dodatkowo, aby nie dawać dwóch spacji obok siebie prawdopodobnie pierwszy znak z jego odpowiedzi także będzie miał "dziwny" token
# Zadanie 9

* Piewszą linijkę generujemy całą znajdując taki output gdzie ilość sylab jest odpowiednia.
* Generujemy (bez modelu) wyrazy które się rymują poprzez jakiś plik ze słownikiem.
* Wybieramy sobie jeden wyraz który się rymuje.
* Generujemy za pomocą papugi poczatek zdania dając max_tokens "na oko" tak by raz wygenerowała ilość sylab które brakuje w dopełnieniu do tego słowa.
* Odfiltrujamy zdania gdzie ilość sylab się nie zgadza.
* Następnie wybieramy zdanie końcowe z najmniejszym perplexity.
# Zadanie 10

Generator przepisów kulinarnych.
Chatgpt w pralce.
Generator kolejnych przystanków autobusowych do podróży.
https://hackmd.io/_uploads/HyWhpnzbkl.png
<!--  -->