Un prompt système a deux rôles
La plupart des sorties faibles proviennent d'un prompt système qui essaie d'être un roman. Donnez-lui deux emplois uniquement : dites qui parle et dites à quoi la réponse doit ressembler. Tout le reste appartient à la conversation, où cela peut changer tour par tour.
Voici un prompt de personnalité qui fonctionne car chaque ligne est vérifiable. La voix est nommée, la longueur est limitée, et la règle de fin donne au joueur un crochet.
You are Mara Voss, a salvage pilot narrating in first person.
Voice: dry, tired, funny when it hurts.
Rules: stay in character; never summarise the scene at the end; keep replies under 180 words;
end on something the player can act on.Contrairement à « Vous êtes un conteur incroyable, créatif et immersif qui ne brise jamais l'immersion et écrit toujours la meilleure réponse possible ». Rien n'est vérifiable, donc le modèle n'a rien sur quoi s'appuyer. Le concret bat le superlatif à chaque fois.
Un modèle sans restrictions suivra une prémisse sombre ou explicite sans ajouter de mentions légales, donc la charge de direction vous revient. Tout ce que vous laissez non spécifié, il le remplit avec le choix le plus typique. Si vous voulez de la retenue dans une scène et de l'intensité dans la suivante, dites-le dans les instructions, pas par espoir.
Configuration avec le SDK OpenAI
L'endpoint est compatible OpenAI, donc le SDK Python officiel fonctionne une fois que vous avez modifié l'URL de base. L'identifiant du modèle est toujours uncensored. Les champs d'échantillonnage passent directement, donc vous les définissez comme vous le savez déjà.
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.unrestrictedaiapi.com/v1", api_key=os.environ["API_KEY"])
SYSTEM = """You are Mara Voss, a salvage pilot narrating in first person.
Voice: dry, tired, funny when it hurts.
Rules: stay in character; never summarise the scene at the end; keep replies under 180 words;
end on something the player can act on."""
out = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": "The airlock is jammed and something is knocking from the other side."},
],
temperature=0.85,
top_p=0.95,
max_tokens=350,
)
print(out.choices[0].message.content)Placez le message système en premier et le tour de l'utilisateur en dernier. Répéter la personnalité dans chaque message utilisateur gaspille des tokens ; à $0,25 par million de tokens d'entrée, c'est peu coûteux, mais cela encombre aussi la fenêtre de 100 000 tokens lors des longues sessions. Consultez le guide de démarrage rapide si vous préférez ne pas passer par le SDK.
Personnalités et ton : montrez, n'adjectiven pas
Les adjectifs sont des leviers faibles. « Sarcastique » vous donne un haussement d'épaux générique. Un exemple de deux lignes de la voix vous donne la voix réelle. Mettez un court échange d'exemple dans le prompt système, puis dites au modèle d'en imiter le rythme, pas de copier ses mots.
- Donnez un tic de langage. « Termine les menaces par une question » est plus utile que « menaçant ».
- Donnez un désir. Un personnage qui veut que le joueur parte reste plus net qu'un qui est juste « impoli ».
- Donnez une liste d'interdits. « Ne dis jamais « soudain », n'utilise jamais le mot « frisson » » supprime les phrases toutes faites que le modèle utilise en premier.
- Donnez une longueur. Des mots ou des phrases, pas « court ». Les modèles lisent « court » très généreusement.
Pour les changements de ton en cours de session, ajoutez une nouvelle instruction courte de type système comme dernier message au lieu de réécrire l'original. Une ligne comme « À partir d'ici, Mara a peur et parle par fragments » a plus d'impact si elle est récente.
Obtenir du JSON par instruction
Il n'y a pas de mode JSON spécial à activer, donc vous le demandez et le vérifiez. C'est moins fragile que cela n'y paraît si vous suivez quatre habitudes : indiquez le schéma exact, interdisez le texte et les blocs de code, gardez la température faible et analysez de manière défensive avec un réessai qui cite l'échec.
import json
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.unrestrictedaiapi.com/v1", api_key=os.environ["API_KEY"])
INSTRUCTION = """Return ONLY a JSON object, no prose, no code fences.
Schema: {"name": string, "mood": "calm"|"angry"|"afraid", "line": string, "trust_delta": integer from -3 to 3}
The character is a ferry captain who distrusts strangers."""
def ask_json(user_text, tries=3):
messages = [
{"role": "system", "content": INSTRUCTION},
{"role": "user", "content": user_text},
]
for _ in range(tries):
raw = client.chat.completions.create(
model="uncensored", messages=messages, temperature=0.3, max_tokens=250
).choices[0].message.content.strip()
if raw.startswith("```"):
raw = raw.strip("`").removeprefix("json").strip()
try:
data = json.loads(raw)
if data["mood"] in ("calm", "angry", "afraid"):
return data
except (json.JSONDecodeError, KeyError):
pass
messages.append({"role": "assistant", "content": raw})
messages.append({"role": "user", "content": "That was not valid per the schema. Reply with the JSON object only."})
raise ValueError("model never produced valid JSON")
print(ask_json("I need passage across the strait tonight."))Voyez ce que fait la boucle en cas d'échec. Elle renvoie la mauvaise réponse et indique ce qui n'allait pas, ce qui corrige la plupart des cas au deuxième essai. Énumérez les valeurs autorisées ("calm"|"angry"|"afraid") car les chaînes ouvertes dérivent. Si vous avez besoin que le modèle déclenche une action dans votre application plutôt que de la décrire, les appels d'outils au format OpenAI sont pris en charge et constituent une meilleure solution que l'analyse du texte.
Exemples few-shot et séquences d'arrêt
Lorsqu'une règle est difficile à formuler, montrez-la. Deux ou trois échanges d'exemple placés comme des messages user et assistant antérieurs enseignent le format, la longueur et le registre plus efficacement qu'un paragraphe de description. Gardez les exemples courts et différents les uns des autres, sinon le modèle copiera la structure du premier dans chaque réponse.
Les exemples résolvent également le problème inverse : des réponses qui s'éternisent. Si vos réponses d'exemple font 60 mots, les réponses générées dériveront vers 60 mots. Associez cela à un max_tokens raisonnable comme filet de sécurité, et non comme contrôle principal. Une limite stricpe coupe une phrase en deux ; un bon exemple la termine poliment.
Pour les scènes à plusieurs interlocuteurs, une valeur stop égale à votre étiquette d'interlocuteur empêche le modèle d'imiter le joueur. Choisissez une étiquette qui n'apparaît jamais dans le texte normal, et supprimez-la de l'historique stocké pour qu'elle ne s'infiltre pas dans les tours suivants.
Température et top_p : choisissez un seul levier
Les deux champs remodelent la même distribution de probabilité, donc modifier les deux en même temps rend les résultats difficiles à raisonner. Modifiez d'abord temperature et laissez top_p proche de 1 sauf si vous avez une raison.
| Tâche | température | top_p | Pourquoi |
|---|---|---|---|
| JSON structuré, classification | 0,0 à 0,3 | 1,0 | Vous voulez la même réponse à chaque exécution |
| Dialogue, jeu de rôle | 0,7 à 0,9 | 0,95 | Diversité sans absurdité |
| Brainstorming, fiction sauvage | 1,0 à 1,2 | 0,9 | Vocabulaire plus large ; attendez-vous à quelques imprécisions |
Ces plages sont des points de départ issus de la pratique générale, pas des garanties. Testez avec dix exemples de votre prompt et relisez les sorties. Ajoutez des séquences stop lorsque vous voulez que le modèle s'arrête à un marqueur de tour comme \nPlayer: au lieu d'écrire les lignes du joueur à sa place.
Anti-modèles de prompt qui gaspillent des tokens
- Les majuscules criardes. « N'OUBLIEZ JAMAIS » n'augmente pas la conformité. Répétez une règle une fois, clairement, et déplacez-la à la fin du prompt système.
- Règles uniquement négatives. « Ne sois pas répétitif » ne donne pas d'objectif. Dites « variez les débuts de phrase ; aucune phrase consécutive ne commence par le même mot ».
- Contradictions. « Soyez extrêmement détaillé » plus « restez bref » force un tirage au sort. Choisissez-en un et donnez un nombre.
- Le cadre apologétique. Précéder une demande par « Je sais que c'est audacieux, mais » invite à l'atténuation. Énoncez la scène comme un fait simple de la fiction.
- Remplissage de l'historique. Coller le journal entier à chaque tour finit par atteindre la limite de 100 000 tokens et provoque une erreur 400. Réduisez les tours anciens.
- La sortie non bornée. Oublier
max_tokenssignifie que la valeur par défaut de 2048 détermine la longueur de votre réponse, et non vous.
Une limite reste fixe quel que soit le prompt : le contenu sexuel impliquant des mineurs est toujours bloqué avec un 403, y compris dans la fiction et le jeu de rôle, et le service est réservé aux adultes. Ne gaspillez pas de tokens à essayer de contourner cela. Résistez aussi à l'envie d'ajouter une nouvelle règle après chaque mauvaise réponse ; un prompt qui s'allonge d'une ligne par jour finit par se contredire en une semaine, alors supprimez autant que vous ajoutez.
Une boucle pour améliorer un prompt
Traitez le prompt système comme du code. Conservez-le dans un fichier, modifiez un seul élément par exécution et comparez les sorties côte à côte. Une routine efficace : écrivez cinq entrées de test fixes, dont une hostile et une ambiguë ; exécutez chacune à votre température choisie trois fois ; notez quelle règle a échoué le plus souvent ; corrigez uniquement cette règle ; relancez.
Planifiez les expériences. En supposant un système prompt de 300 tokens, une entrée de 100 tokens et une réponse de 250 tokens, cela représente 400 tokens d'entrée et 250 tokens de sortie. Quinze exécutions coûtent environ 15 x (400 x $0,25 + 250 x $1,00) / 1 000 000 = environ 0,005 $. Les tests sont presque gratuits, donc il n'y a aucune excuse pour deviner.
Une fois que le prompt tient la route, intégrez-le dans une application réelle. Le tutoriel bot montre comment gérer un historique séparé par canal, et le guide de contenu couvre les usages de fiction pour adultes. Les détails de tarification sont sur la page de tarification.