Zum Hauptinhalt springen
TypeChat

Einführung von TypeChat

20. Juli 2023 von Anders Hejlsberg, Steve Lucco, Daniel Rosenwasser, Pierce Boggan, Umesh Madan, Mike Hopcroft und Gayathri Chandrasekaran

In den letzten Monaten haben wir eine Welle der Begeisterung für die neueste Generation großer Sprachmodelle (Large Language Models, LLMs) erlebt. Während Chat-Assistenten die direkteste Anwendung waren, stellt sich die große Frage, wie diese Modelle am besten in bestehende App-Schnittstellen integriert werden können.

Anders ausgedrückt: Wie können wir traditionelle Benutzeroberflächen mit natürlichsprachlichen Schnittstellen *erweitern*? Wie können wir KI nutzen, um eine Benutzeranfrage entgegenzunehmen und sie in etwas umzuwandeln, mit dem unsere Apps arbeiten können? Und wie stellen wir sicher, dass unsere Apps sicher sind und Arbeit verrichten, der Entwickler und Benutzer gleichermaßen vertrauen können?

Heute veröffentlichen wir TypeChat, eine experimentelle Bibliothek, die Antworten auf diese Fragen liefern soll. Sie nutzt die Typdefinitionen in Ihrem Code, um strukturierte und typsichere KI-Antworten abzurufen.

Sie können TypeChat noch heute einrichten, indem Sie

npm install typechat

ausführen und es mit jedem beliebigen Sprachmodell verbinden, um es mit Ihrer App zu verwenden.

Aber lassen Sie uns zuerst kurz untersuchen, warum TypeChat existiert.

Verwöhnen und Parsen

Die aktuelle Welle von LLMs gibt standardmäßig in *natürlicher* Sprache aus – Sprachen, in denen Menschen wie wir auf Deutsch kommunizieren. Das Parsen natürlicher Sprache ist eine äußerst schwierige Aufgabe, egal wie sehr Sie einen Prompt mit Regeln wie "Antworte in Form einer Stichpunktliste" verwöhnen. Natürliche Sprache mag Struktur haben, aber für typische Software ist es schwierig, sie aus rohem Text zu rekonstruieren.

Überraschenderweise können wir LLMs bitten, in JSON-Form zu antworten, und sie antworten im Allgemeinen mit etwas Sinnvollem!

Benutzer

Übersetzen Sie die folgende Anfrage in JSON.

Könnte ich einen Blaubeermuffin und einen großen Latte haben?

Antworten Sie nur in JSON wie folgt

{
    "items": [
        { "name": "croissant", "quantity": 2  },
        { "name": "latte", "quantity": 1, "size": "tall" }
    ]
}

ChatBot

{
    "items": [
        {
            "name": "blueberry muffin",
            "quantity": 1
        },
        {
            "name": "latte",
            "quantity": 1,
            "size": "grande"
        }
    ]
}

Das ist gut – obwohl dieses Beispiel die bestmögliche Antwort zeigt. Während Beispiele helfen können, die Struktur zu leiten, definieren sie nicht umfassend, was eine KI zurückgeben soll, und sie liefern nichts, gegen das wir validieren können.

Fügen Sie einfach Typen hinzu!

Glücklicherweise tun Typen genau das. Wir haben festgestellt, dass Typen, da LLMs so viele Typdefinitionen in freier Wildbahn gesehen haben, auch als großartiger Leitfaden dafür dienen, wie eine KI antworten sollte. Da wir typischerweise mit JSON – *JavaScript* Object Notation – arbeiten und da es uns sehr am Herzen liegt, verwenden wir TypeScript-Typen in unseren Prompts.

Benutzer

Übersetzen Sie die folgende Anfrage in JSON.

Könnte ich einen Blaubeermuffin und einen großen Latte haben?

Antworten Sie nur in JSON, das dem Response-Typ entspricht

type Response = {
    items: Item[];
};

type Item = {
    name: string;
    quantity: number;
    size?: string;
    notes?: string;
}

ChatBot

{
  "items": [
    {
      "name": "blueberry muffin",
      "quantity": 1
    },
    {
      "name": "latte",
      "quantity": 1,
      "size": "grande"
    }
  ]
}

Das ist ziemlich großartig! TypeScript hat gezeigt, dass es sich gut zur präzisen Beschreibung von JSON eignet. Aber was passiert, wenn ein Sprachmodell stolpert und eine Antwort erfindet, die nicht mit unseren Typen übereinstimmt?

Nun, da diese Typen gültiger TypeScript-Code sind, können wir die Antwort mithilfe des TypeScript-Compilers selbst dagegen validieren! Tatsächlich können die Fehlermeldungen des Compilers sogar zur Reparatur verwendet werden. Zusammengenommen erhalten wir einen robusten Prozess für gut getypte Antworten, die unsere Apps weiter verarbeiten, mit einem Benutzer validieren usw. können.

Mit anderen Worten: Typen sind alles, was Sie brauchen.

Treten Sie TypeChat ein

Die Technik, eine menschliche Eingabeaufforderung mit einem "Antwortschema" zu kombinieren, ist nicht unbedingt neu – aber sie ist vielversprechend. Und da wir uns darauf konzentriert haben, die Benutzerabsicht in strukturierte Daten zu übersetzen, haben wir festgestellt, dass TypeScript für diese Aufgabe sehr gut geeignet ist. Wir sind uns dieses Ansatzes immer sicherer geworden und veröffentlichen daher, um ihn zu beweisen, eine Bibliothek namens TypeChat, die seine Verwendung in Ihren Apps erleichtert. TypeChat ist bereits auf npm verfügbar, wenn Sie es jetzt ausprobieren möchten, und bietet Tools für Prototyping von Prompts, Schemavalidierung, Reparatur und mehr.

Hier ist der grundlegende Code, um TypeChat an ein LLM anzubinden und zu entscheiden, ob ein Satz negativ, neutral oder positiv ist.

// ./src/sentimentSchema.ts

// The following is a schema definition for determining the sentiment of a some user input.

export interface SentimentResponse {
    /** The sentiment of the text. */
    sentiment: "negative" | "neutral" | "positive";
}
// ./src/main.ts

import * as fs from "fs";
import * as path from "path";
import dotenv from "dotenv";
import * as typechat from "typechat";
import { SentimentResponse } from "./sentimentSchema";

// Load environment variables.
dotenv.config({ path: path.join(__dirname, "../.env") });

// Create a language model based on the environment variables.
const model = typechat.createLanguageModel(process.env);

// Load up the contents of our "Response" schema.
const schema = fs.readFileSync(path.join(__dirname, "sentimentSchema.ts"), "utf8");
const translator = typechat.createJsonTranslator<SentimentResponse>(model, schema, "SentimentResponse");

// Process requests interactively.
typechat.processRequests("😀> ", /*inputFile*/ undefined, async (request) => {
    const response = await translator.translate(request);
    if (!response.success) {
        console.log(response.message);
        return;
    }
    console.log(`The sentiment is ${response.data.sentiment}`);
});

TypeChat kann auf verschiedene Weise verwendet werden. Die bisher diskutierte Methode konzentriert sich auf die Verwendung eines "Datenschemas", um eine Benutzerabsicht in eine strukturierte Antwort umzuwandeln; TypeChat ermöglicht jedoch auch die Verwendung eines "API-Schemas" zur Erstellung einfacher Programme. Wir haben einige Dokumentation und Beispiele, um einen Eindruck von den verschiedenen Möglichkeiten zu bekommen, wie Sie TypeChat verwenden können.

Offen und erweiterbar

Erstens ist TypeChat Open Source. Wir haben eine MIT-Lizenz und Sie können uns auf GitHub finden, wo wir uns auf Ihre Gedanken freuen, unsere Ideen teilen und mit Ihnen zusammenarbeiten möchten.

Zweitens ist TypeChat so aufgebaut, dass es modellunabhängig ist. Obwohl wir der Einfachheit halber einige sehr grundlegende Integrationen mit der OpenAI API und dem Azure OpenAI Service haben, sollte dieser Ansatz für jede Chat-Completion-API funktionieren, die Sie verwenden möchten – beachten Sie jedoch, dass TypeChat derzeit am besten mit Modellen funktioniert, die sowohl auf Text als auch auf Code trainiert wurden.

Probieren Sie es noch heute aus!

Wir würden uns freuen zu erfahren, ob TypeChat für Sie nützlich und interessant ist! Wie erwähnt, heißen wir Sie auf GitHub willkommen, wenn Sie Fragen, Vorschläge oder mehr haben.

Viel Spaß beim Programmieren!