Ein Modell mit einem Werkzeugkasten
Ein Werkzeug ist einfach. Ein echter Assistent hat mehrere: eine Preisabfrage, einen Einheitenrechner, einen Ort für Notizen. Das Modell wählt für jede Anfrage eines aus, und Ihr Programm muss jede Anfrage an die richtige Funktion schicken.
Es muss auch damit umgehen, dass das Modell ein Werkzeug anfordert, das es nicht gibt.
Am Ende dieser Lektion
Notiz
Ich kann mehr als ein Werkzeug anbieten und jede Anfrage an die richtige Funktion verteilen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Verteiler | Code, der eine Anfrage an die richtige Funktion schickt |
| Werkzeugtabelle | eine Tabelle, die jeden Werkzeugnamen seiner Funktion zuordnet |
| Unbekanntes Werkzeug | ein Name, der nicht in Ihrer Werkzeugtabelle steht |
| Pflichtargument | ein Wert, ohne den das Werkzeug nicht laufen kann |
| Prüfung | eine Anfrage kontrollieren, bevor man handelt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Werkzeugtabelle ordnet Namen Funktionen zu
Halten Sie Ihre Werkzeuge in einer einzigen Tabelle. Der Schlüssel ist der Name, den das Modell verwendet. Der Wert ist Ihre Funktion.
Um eine Anfrage zu verteilen, suchen Sie den Namen in der Tabelle und rufen auf, was Sie finden. Ein Werkzeug hinzuzufügen ist dann eine Zeile, und die Tabelle ist die einzige Liste dessen, was das Modell nutzen darf.
Durchgerechnetes Beispiel: ein Kasten mit drei Werkzeugen
| Name | Was es tut | Pflichtargument |
|---|---|---|
| preis_von | Schlägt den Preis eines Artikels nach | artikel |
| km_in_meilen | Rechnet Kilometer in Meilen um | km |
| notiz_hinzufuegen | Speichert eine kurze Notiz | text |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Einen Helfer speichern, der das Modell aufruft
docker exec -w /home/node/project agent node -e "const fragen=async(m,t,c)=>{const r=await fetch((process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions',{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:m,tools:t,tool_choice:c,max_tokens:120})});const j=await r.json();if(r.ok)return j.choices[0].message;throw Error(r.status+' '+j.error.message)};require('fs').writeFileSync('ki.cjs','exports.fragen='+fragen+';');console.log('ki.cjs gespeichert: fragen(messages, tools) gibt die Nachricht des Modells zurück.')"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Lehnen Sie eine unmögliche Anfrage ab
Ein Modell kann einen Namen anfordern, der nicht in Ihrer Tabelle steht. Es kann unlesbare Argumente senden. Es kann ein Pflichtargument vergessen. Prüfen Sie alle drei Fälle, bevor Sie irgendetwas aufrufen.
Eine Ablehnung ist eine Nachricht an das Modell, etwa Fehler: unbekanntes Werkzeug alles_loeschen. Sie ist nie ein Absturz, und nichts wird ausgeführt.
Vier Anfragen verteilen, zwei davon schlecht
docker exec -w /home/node/project agent node -e "const F={preis_von:a=>({apfel:40,birne:45})[a.artikel],km_in_meilen:a=>a.km*0.62,notiz_hinzufuegen:a=>'gespeichert'};const P={preis_von:['artikel'],km_in_meilen:['km'],notiz_hinzufuegen:['text']};const verteilen=c=>{if(Object.hasOwn(F,c.name)===false)return 'Fehler: unbekanntes Werkzeug '+c.name;let a;try{a=JSON.parse(c.arguments)}catch(e){return 'Fehler: ungültige Argumente'}for(const k of P[c.name])if((k in a)===false)return 'Fehler: fehlt '+k;return String(F[c.name](a))};for(const c of [{name:'preis_von',arguments:JSON.stringify({artikel:'birne'})},{name:'alles_loeschen',arguments:'{}'},{name:'preis_von',arguments:'{artikel:'},{name:'km_in_meilen',arguments:'{}'}])console.log(c.name+' -> '+verteilen(c))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Einem Modell drei Werkzeuge anbieten
docker exec -w /home/node/project agent node -e "const{fragen}=require('./ki.cjs');const w=(n,d,k)=>({type:'function',function:{name:n,description:d,parameters:{type:'object',properties:{[k]:{type:k=='km'?'number':'string'}}}}});const T=[w('preis_von','Preis eines Artikels.','artikel'),w('km_in_meilen','Rechnet km in Meilen um.','km'),w('notiz_hinzufuegen','Speichert eine Notiz.','text')];const F={preis_von:a=>({apfel:40,birne:45})[a.artikel],km_in_meilen:a=>Math.round(a.km*621.371)/1000,notiz_hinzufuegen:a=>'gespeichert: '+a.text};(async()=>{let c;try{c=(await fragen([{role:'user',content:'Wie viele Meilen sind 10 km?'}],T,'required')).tool_calls[0]}catch(e){console.log('Kein Modell ('+e.message+'). Aufgezeichnetes Beispiel:');c={function:{name:'km_in_meilen',arguments:JSON.stringify({km:10})}}}const f=c.function;console.log('Anfrage: '+f.name+' '+f.arguments);console.log('Ergebnis: '+(Object.hasOwn(F,f.name)?F[f.name](JSON.parse(f.arguments)):'unbekanntes Werkzeug'))})()"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele glauben, das Modell fordere nur Werkzeuge an, die Sie angeboten haben. Es kann jeden Namen anfordern und Argumente senden, die nicht passen. Prüfen Sie immer den Namen gegen Ihre Tabelle und die Argumente gegen das, was das Werkzeug braucht.
Zum Weiterdenken: ein viertes Werkzeug
Fügen Sie im Verteiler-Lauf ein Werkzeug namens rufen (wie „laut rufen“) hinzu, das sein Argument text in Großbuchstaben zurückgibt. Tragen Sie es in F und in P ein und senden Sie eine Anfrage dafür.
Schreiben Sie auf, an wie vielen Stellen Sie den Code ändern mussten.