Section 13.6.1 : OpenAI API et prompt engineering
🎯 Objectif pédagogique
Intégrer l'API OpenAI dans une application Rails, comprendre les modèles GPT, maîtriser le prompt engineering et construire des fonctionnalités IA concrètes.
L'API OpenAI
L'API OpenAI donne accès aux modèles GPT-4, GPT-3.5 et aux embeddings. C'est l'interface programmatique qui permet à vos applications d'utiliser l'intelligence artificielle.
# Gemfile
gem 'ruby-openai'
# config/initializers/openai.rb
OpenAI.configure do |config|
config.access_token = ENV.fetch('OPENAI_API_KEY')
config.organization_id = ENV.fetch('OPENAI_ORG_ID', nil)
end
OPENAI_CLIENT = OpenAI::Client.new
Premier appel API
# app/services/ai_service.rb
class AiService
def self.chat(prompt, system_message: nil)
messages = []
messages << { role: 'system', content: system_message } if system_message
messages << { role: 'user', content: prompt }
response = OPENAI_CLIENT.chat(
parameters: {
model: 'gpt-4',
messages: messages,
temperature: 0.7,
max_tokens: 1000
}
)
response.dig('choices', 0, 'message', 'content')
end
end
# Utilisation
result = AiService.chat(
'Résume cet article en 3 points clés',
system_message: 'Tu es un assistant de rédaction concis et précis.'
)
Prompt Engineering : l'art du prompt
Le prompt engineering est la compétence de formuler des instructions claires pour obtenir le résultat désiré des LLMs.
# MAUVAIS prompt
AiService.chat('Écris quelque chose sur le marketing')
# BON prompt - structuré
AiService.chat(
'Rédige 5 titres d email marketing pour une vente flash de 48h ' \
'sur des chaussures de running. ' \
'Cible : hommes 25-40 ans, sportifs occasionnels. ' \
'Ton : urgent mais pas agressif. ' \
'Format : un titre par ligne, max 60 caractères.',
system_message: 'Tu es un expert en copywriting email avec 10 ans ' \
'd expérience en e-commerce sportif.'
)
Les techniques de prompt engineering
# 1. Few-shot prompting (exemples)
prompt = <<~PROMPT
Classifie le sentiment de ces avis client.
Exemples :
"Livraison rapide, produit top !" => POSITIF
"Trois semaines d attente, inadmissible" => NÉGATIF
"Le produit est correct, rien de spécial" => NEUTRE
Classifie :
"#{avis_client}"
PROMPT
# 2. Chain-of-thought (raisonnement étape par étape)
prompt = <<~PROMPT
Analyse ce business plan étape par étape :
1. Identifie le marché cible
2. Évalue la proposition de valeur
3. Analyse le modèle de revenus
4. Identifie les risques
5. Donne une note de 1 à 10
Business plan : #{business_plan}
Raisonne à voix haute avant de donner ta note finale.
PROMPT
# 3. Structured output (JSON)
prompt = <<~PROMPT
Extrais les informations de cette facture.
Retourne UNIQUEMENT un JSON valide avec cette structure :
{
"numero_facture": "string",
"date": "YYYY-MM-DD",
"montant_total": number,
"lignes": [{"description": "string", "montant": number}]
}
Facture : #{texte_facture}
PROMPT
result = AiService.chat(prompt)
data = JSON.parse(result)
Intégrer l'IA dans un Controller Rails
# app/controllers/ai_summaries_controller.rb
class AiSummariesController < ApplicationController
def create
@article = Article.find(params[:article_id])
authorize @article
summary = AiService.chat(
"Résume cet article en 3 bullet points de max 20 mots chacun :\n\n#{@article.content}",
system_message: 'Tu es un assistant de synthèse. Sois concis et précis.'
)
@article.update(ai_summary: summary)
redirect_to @article, notice: 'Résumé IA généré !'
end
end
Quelle est la différence entre temperature 0 et temperature 1 dans l'API OpenAI ?
Apprendre l’IA, du premier prompt aux agents