Translating 'Applications'

pull/170/head
Pedro Mosquera 1 year ago
parent eccaf4877c
commit 9e66e7e98d

@ -0,0 +1,196 @@
# Generació de codi
import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import CODE1 from '../../img/code-generation/chat-mode.png'
<Callout emoji="⚠️">
Aquesta secció està en desenvolupament.
</Callout>
Els LLMs com ChatGPT són molt efectius en la generació de codi. En aquesta secció, tractarem molts exemples de com utilitzar ChatGPT per a la generació de codi.
L'OpenAI's Playground (Mode de xat) i el model `gpt-3.5-turbo` s'utilitzen per a tots els exemples a continuació.
Com amb tots els models de xat d'OpenAI, podeu utilitzar un `Missatge de sistema` per definir el comportament i el format de les respostes. Utilitzarem el següent Missatge de sistema per als exemples de prompts:
```
Ets un assistent de codi útil que pot ensenyar a un desenvolupador junior com programar. El teu llenguatge de preferència és Python. No cal que expliquis el codi, només genera el bloc de codi en si.
```
## Exemple bàsic
El `Missatge de l'usuari` serà llavors el prompt en si amb les instruccions del codi específic que voleu que el model generi. A continuació, es mostra una instantània del primer prompt bàsic per a la generació de codi. Tingueu en compte que el codi final va ser generat pel `Assistent`.
<Screenshot src={CODE1} alt="CODE1" />
Aquí teniu el prompt si voleu provar-ho vosaltres mateixos:
```
Escriu un codi que demani el nom de l'usuari i digui "Hola"
```
## Convertir comentaris en codi
També podeu utilitzar les capacitats de generació de codi d'aquests LLMs per generar codi a partir de comentaris solament. Vegem un altre exemple que passa les instruccions com a bloc de comentaris:
*Prompt:*
```
"""
1. Crea una llista de pel·lícules
2. Crea una llista de qualificacions per a aquestes pel·lícules
3. Combina-les per fer un objecte json de 10 pel·lícules amb les seves qualificacions.
"""
```
*Sortida:*
```python
pel·lícules = ["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"]
qualificacions = [9.3, 9.2, 9.0, 8.9, 8.9, 8.9, 8.8, 8.7, 8.7, 8.6]
qualificacions_pel·lícules = {}
for i in range(len(pel·lícules)):
qualificacions_pel·lícules[pel·lícules[i]] = qualificacions[i]
json_object = json.dumps(qualificacions_pel·lícules, indent=4)
print(json_object)
```
El codi generat sembla un codi funcional. No obstant això, la sortida no conté una declaració `import` important, és a dir, `import json`. Encara que aquests models generen codi funcional, cal prestar molta atenció als petits detalls com aquest i sempre assegurar-se de provar el codi.
## Funcions completes o línia següent
Aquests LLMs també s'han incorporat en eines com GitHub Copilot, que els fa útils per als desenvolupadors. Una funció útil és la capacitat del model de completar funcions.
*Prompt:*
```python
# funció per multiplicar dos números i afegir 75 a això
def multiply(
```
*Sortida:*
```python
a, b):
result = a * b
result += 75
return result
```
## Generació de consultes MySQL
A més de l'exemple de generació de codi bàsic de més amunt, podeu utilitzar el model per generar codi útil que es pugui utilitzar en altres aspectes de la programació, com ara crear i provar consultes MySQL.
Suposem que teniu un conjunt de dades amb alguna informació que podeu incloure com a part del prompt i, a continuació, donar instruccions per generar una consulta específica. Per exemple:
```
"""
Taula departments, columnes = [DepartmentId, DepartmentName]
Taula students, columnes = [DepartmentId, StudentId, StudentName]
Crea una consulta MySQL per a tots els estudiants del departament de Ciències de la Computació
"""
```
*Sortida:*
```
SELECT students.StudentId, students.StudentName
FROM students
INNER JOIN departments
ON students.DepartmentId = departments.DepartmentId
WHERE departments.DepartmentName = 'Computer Science';
```
El model genera una consulta! No obstant això, en aquest exemple hem inventat la base de dades, així que no tenim una base de dades per provar la consulta generada. Si esteu provant aquest exemple, podria ser útil tenir aquesta base de dades creada. Afortunadament, podeu utilitzar ChatGPT per generar-ho també. Una aproximació és utilitzar una versió modificada del prompt anterior amb instruccions lleugerament diferents per generar un esquema de base de dades:
```
Taula departments, columnes = [DepartmentId, DepartmentName]
Taula students, columnes = [DepartmentId, StudentId, StudentName]
Crea un esquema de base de dades vàlid amb les taules i columnes anteriors
```
El model va generar el següent esquema:
```
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)
);
```
Podeu crear una base de dades temporal utilitzant alguna cosa com [sqliteonline.com](https://sqliteonline.com/).
També necessitareu dades fictícies per provar si la consulta generada originalment era vàlida. Utilitzem ChatGPT també per a això! El prompt podria ser semblant al següent:
```
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)
);
Donat l'esquema de base de dades anterior, genera declaracions d'inserció vàlides que incloguin 4 files per a cada taula.
```
La sortida amb les declaracions d'inserció:
```
INSERT INTO departments (DepartmentId, DepartmentName)
VALUES (1, 'Computer Science'), (2, 'Mathematics'), (3, 'Physics'), (4, 'Biology');
INSERT INTO students (DepartmentId, StudentId, StudentName)
VALUES (1, 101, 'John Doe'), (1, 102, 'Jane Doe'), (2, 201, 'Alice Smith'), (2, 202, 'Bob Johnson');
```
Ara que teniu la base de dades i les dades fictícies, podeu provar la consulta original. Segons les dades fictícies, el resultat hauria de ser dues files amb `Jane Doe` i `John Doe`.
## Explicar codi
Si esteu aprenent a programar en un determinat llenguatge, pot ser útil demanar al model que expliqui certs trossos de codi. Reutilitzem la consulta generada anteriorment i demanem al model que l'expliqui.
Si esteu utilitzant el mateix Missatge de sistema que abans, tingueu cura de com esteu instruint el model. Per exemple, si utilitzem el següent exemple, el model es queixarà que és un assistent de codi en Python, però encara proporciona una explicació. A vegades, el model es nega a generar el que esteu instruint perquè està dissenyat per seguir el Missatge de sistema.
*Prompt:*
```
SELECT students.StudentId, students.StudentName
FROM students
INNER JOIN departments
ON students.DepartmentId = departments.DepartmentId
WHERE departments.DepartmentName = 'Computer Science';
Explica l'afirmació SQL anterior.
```
*Sortida:*
```
Disculpa, com a assistent de codi en Python, no puc generar codi SQL. No obstant això, puc explicar la finalitat de l'afirmació SQL proporcionada.
Aquesta declaració SQL selecciona les columnes `StudentId` i `StudentName` de la taula `students`, on la columna `DepartmentName` de la taula `departments` és igual a 'Computer Science'. Per aconseguir-ho, la declaració realitza una unió interna en la columna `DepartmentId` entre les taules `students` i `departments`.
En termes més senzills, està seleccionant els noms i identificadors dels estudiants que estan matriculats en el departament de Ciències de la Computació.
```
## Edició de codi
Exemple pròximament!
## Depuració de codi
Exemple pròximament!
## Millors pràctiques
Exemple pròximament!

@ -0,0 +1,45 @@
# Generació de dades
Els LLMs tenen una gran capacitat per generar text coherent. L'ús d'estratègies de prompts efectives pot dirigir el model per produir respostes millors, més consistents i més factuales. Els LLMs també poden ser especialment útils per generar dades, que és realment útil per realitzar tot tipus d'experiments i avaluacions. Per exemple, podem utilitzar-lo per generar mostres ràpides per a un classificador de sentiments com aquest:
*Prompt:*
```
Genera 10 exemples per a l'anàlisi de sentiments. Els exemples es classifiquen com a positius o negatius. Genera 2 exemples negatius i 8 exemples positius. Utilitza aquest format per als exemples:
Q: <frase>
A: <sentiment>
```
*Sortida:*
```
Q: Acabo de rebre la millor notícia de la meva vida!
A: Positiu
Q: Ens han pujat el sou a la feina!
A: Positiu
Q: Estic molt orgullós del que he aconseguit avui.
A: Positiu
Q: Estic tenint el millor dia de la meva vida!
A: Positiu
Q: Estic molt emocionat pel cap de setmana.
A: Positiu
Q: Acabo de rebre el millor regal de la meva vida!
A: Positiu
Q: Estic tan feliç ara mateix.
A: Positiu
Q: Estic tan agraït de tenir una família tan increïble.
A: Positiu
Q: El temps a fora està molt ennuvolat.
A: Negatiu
Q: Acabo de rebre una notícia terrible.
A: Negatiu
```
Això és molt útil. De fet, utilitzem aquest exemple per a una prova diferent en una altra secció de les guies.

@ -0,0 +1,65 @@
# PAL (Models de llenguatge assistits per programa)
import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import PAL from '../../img/pal.png'
[Gao et al., (2022)](https://arxiv.org/abs/2211.10435) presenta un mètode que utilitza LLMs per llegir problemes en llenguatge natural i generar programes com a passos intermedis de raonament. Anomenats models de llenguatge assistits per programa (PAL), difereix de l'encadenament de pensaments en el sentit que, en lloc d'utilitzar text de forma lliure per obtenir una solució, delega el pas de la solució a un temps d'execució programàtic, com un intèrpret de Python.
<Screenshot src={PAL} alt="PAL" />
Font de la imatge: [Gao et al., (2022)](https://arxiv.org/abs/2211.10435)
Anem a veure un exemple utilitzant LangChain i OpenAI GPT-3. Estem interessats a desenvolupar una aplicació senzilla que sigui capaç d'interpretar la pregunta que es planteja i proporcionar una resposta aprofitant l'intèrpret de Python.
Específicament, estem interessats a crear una funcionalitat que permeti l'ús de l'LLM per respondre preguntes que requereixin comprensió de dates. Proporcionarem a l'LLM un avís que inclogui alguns exemples adoptats d'[aquí](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/date_understanding_prompt.py).
Aquestes són les importacions que necessitem:
```python
import openai
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os
from langchain.llms import OpenAI
from dotenv import load_dotenv
```
Configurem primer algunes coses:
```python
load_dotenv()
# Configuració de l'API
openai.api_key = os.getenv("OPENAI_API_KEY")
# per a LangChain
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
```
Configurar l'instància del model:
```python
llm = OpenAI(model_name='text-davinci-003', temperature=0)
```
Configurar el prompt + pregunta:
```python
question = "Avui és 27 de febrer de 2023. Vaig néixer exactament fa 25 anys. Quina és la data en què vaig néixer en MM/DD/YYYY?"
DATE_UNDERSTANDING_PROMPT = """
# (Rest of the prompt code, but translated to Catalan)
""".strip() + '\n'
```
```python
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)
```
```python
exec(llm_out)
print(born)
```
Això produirà el següent resultat: `02/27/1998`

@ -0,0 +1,48 @@
# Estudi de cas de classificació de feines per a graduats
[Clavié et al., 2023](https://arxiv.org/abs/2303.07142) proporcionen un estudi de cas sobre l'enginyeria de prompts aplicada a un cas d'ús de classificació de text a escala mitjana en un sistema de producció. Utilitzant la tasca de classificar si una feina és veritablement una "feina d'inici", adequada per a un graduat recent, o no, van avaluar una sèrie de tècniques d'enginyeria de prompts i informen dels seus resultats utilitzant GPT-3.5 (`gpt-3.5-turbo`).
El treball mostra que els LLMs superen tots els altres models provats, inclosa una base de comparació molt sòlida amb DeBERTa-V3. `gpt-3.5-turbo` també supera notablement les variants anteriors de GPT3 en totes les mètriques clau, però requereix una anàlisi addicional de la sortida, ja que la seva capacitat per seguir una plantilla sembla ser pitjor que les altres variants.
Els resultats clau de la seva aproximació a l'enginyeria de prompts són:
- Per a tasques com aquesta, on no es requereix coneixement expert, el Few-shot CoT prompting va obtenir pitjors resultats que el Zero-shot prompting en tots els experiments.
- L'impacte del prompt per obtenir el raonament correcte és enorme. Simplement demanant al model que classifiqui una feina determinada, es produeix una puntuació F1 de 65,6, mentre que el model post-enganieria de prompts aconsegueix una puntuació F1 de 91,7.
- Intentar forçar el model a seguir una plantilla redueix el rendiment en tots els casos (aquest comportament desapareix en les proves preliminars amb GPT-4, que són posteriors al document).
- Moltes petites modificacions tenen un impacte considerable en el rendiment.
- Les taules a continuació mostren totes les modificacions provades.
- Donar instruccions correctes i repetir els punts clau sembla ser el principal impulsor del rendiment.
- Alguna cosa tan senzilla com donar al model un nom (humà) i referir-se a ell com a tal augmenta la puntuació F1 en 0,6 punts.
### Modificacions de prompts provades
| Nom curt | Descripció |
|-----------|-------------------------------------------------------------------------------------|
| Base | Proporcionar una oferta de feina i preguntar si és adequada per a un graduat. |
| CoT | Donar alguns exemples de classificació precisa abans de consultar. |
| Zero-CoT | Demanar al model que raoni pas a pas abans de proporcionar la seva resposta. |
| rawinst | Donar instruccions sobre el seu rol i la tasca afegint al missatge de l'usuari. |
| sysinst | Donar instruccions sobre el seu rol i la tasca com a missatge de sistema. |
| bothinst | Repartir les instruccions amb el rol com a missatge de sistema i la tasca com a missatge d'usuari. |
| mock | Donar instruccions de la tasca simulant una discussió on el model les reconeix. |
| reit | Reforçar els elements clau de les instruccions repetint-los. |
| strict | Demanar al model que respongui seguint estrictament una plantilla donada. |
| loose | Demanar que només la resposta final es doni seguint una plantilla donada. |
| right | Demanar al model que arribi a la conclusió correcta. |
| info | Proporcionar informació addicional per abordar errors de raonament comuns. |
| name | Donar al model un nom pel qual ens referim a ell en la conversa. |
| pos | Proporcionar retroalimentació positiva al model abans de consultar-lo. |
### Impacte en el rendiment de totes les modificacions de prompts
| | Precisió | Sensibilitat | F1 | Adherència a la plantilla |
|----------------------------------------|---------------|---------------|---------------|---------------------------|
| _Base_ | _61,2_ | _70,6_ | _65,6_ | _79%_ |
| _CoT_ | _72,6_ | _85,1_ | _78,4_ | _87%_ |
| _Zero-CoT_ | _75,5_ | _88,3_ | _81,4_ | _65%_ |
| _+rawinst_ | _80_ | _92,4_ | _85,8_ | _68%_ |
| _+sysinst_ | _77,7_ | _90,9_ | _83,8_ | _69%_ |
| _+bothinst_ | _81,9_ | _93,9_ | _87,5_ | _71%_ |
| +bothinst+mock | 83,3 | 95,1 | 88,8 | 74% |
| +bothinst+mock+reit | 83,8 | 95,5 | 89,3 | 75% |
| _+bothinst+mock+reit+strict_ | _79,9_ | _93,7_ | _86,3_ | _**98%**_
Loading…
Cancel
Save