Aller au contenu
A simple 8-bit chat interface made of geometric speech bubbles in a repeating Q&A sequence, all in flat bold colors. One bubble stands out with an arrow signifying a rewrite. No text, people, or decoration, just clean 2D shapes on a blank background.

Participants au Chat

AI generated translation.

La fonction defChatParticipant permet d’enregistrer une fonction qui peut ajouter de nouveaux messages d’utilisateur dans la séquence de chat, …ou réécrire l’historique complet des messages. Cela permet de créer des chats multi-tours, de simuler une conversation avec plusieurs participants ou de réécrire des invites à la volée.

let turn = 0
defChatParticipant((_, messages) => {
if (++turn === 1) _.$`Are you sure?`
})

Dans l’exemple ci-dessus, la fonction defChatParticipant est utilisée pour enregistrer une fonction qui sera appelée à chaque fois qu’un nouveau message est ajouté au chat.

La fonction reçoit deux arguments : le premier argument est l’objet Chat, et le second argument est la liste des messages qui ont été ajoutés au chat depuis le dernier appel à la fonction.

defChatParticipant(async (_, messages) => {
const text = messages.at(-1).content as string
...
})

Le participant sera appelé à chaque tour, il est donc important de suivre les tours pour éviter les boucles infinies.

let turn = 0
defChatParticipant((_, messages) => {
if (++turn === 1) _.$`Are you sure?`
})

Pour réécrire l’historique des messages, renvoyez une nouvelle liste de nouveaux messages. Le tableau des messages peut être modifié sur place car il s’agit déjà d’un clone structurel de l’historique des messages d’origine.

defChatParticipant((_, messages) => {
messages.push({
role: "user",
content: "Make it better!",
})
return { messages }
})

Ce script utilise un chat multi-tours pour générer des questions, des réponses et valider la qualité des réponses.

qa-gen.genai.mjs
script({
model: "small",
title: "Multi-turn conversation",
files: ["src/rag/markdown.md"],
system: ["system", "system.files"],
tests: {},
});
def("FILE", env.files);
$`Generate a set of questions for the files to build a FAQ.`;
// turn 2
let turn = 0;
defChatParticipant(
async (ctx, messages) => {
turn++;
if (turn <= 1) {
const text = messages.at(-1).content as string;
const questions =
text
?.split("\n")
.map((q) => q.trim())
.filter((q) => q.length > 0) || [];
ctx.$`Here is the list of answers to the questions in the file.
## Task 1:
Validate the quality of the answer.
## Task 2:
Write the question/answers pairs for each file in a "<filename>.qt.jsonl" file
using the JSONL format:
\`\`\`\`markdown
File: <filename>.qt.jsonl
\`\`\`
${JSONL.stringify([
{ q: "<question1>", a: "<answer1>" },
{ q: "<question2>", a: "<answer2>" },
])}
...
\`\`\`
\`\`\`\`
### Questions:
`;
for (const question of questions) {
const res = await runPrompt(
(_) => {
_.def("FILE", env.files);
_.def("QUESTION", question);
_.$`
## Roles
You are an expert educator at explaining concepts simply.
## Task
Answer the QUESTION using the contents in FILE.
## Instructions
- Use information in FILE exclusively.
- Be concise.
- Use simple language.
- use gitmojis.
`;
},
{ label: question },
);
ctx.$`
- question: ${question}`;
ctx.fence(res.text);
ctx.$`\n\n`;
}
}
},
{ label: "answerer" },
);