
Participants au Chat
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 = 0defChatParticipant((_, 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 ...})
Suivi des tours
Section intitulée « Suivi des tours »Le participant sera appelé à chaque tour, il est donc important de suivre les tours pour éviter les boucles infinies.
let turn = 0defChatParticipant((_, messages) => { if (++turn === 1) _.$`Are you sure?`})
Réécrire les messages
Section intitulée « Réécrire les messages »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 }})
Exemple : Générateur de questions-réponses
Section intitulée « Exemple : Générateur de questions-réponses »Ce script utilise un chat multi-tours pour générer des questions, des réponses et valider la qualité des réponses.
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 2let 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" fileusing the JSONL format:
\`\`\`\`markdownFile: <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" },);