介绍 TypeChat
2023 年 7 月 20 日,作者:Anders Hejlsberg, Steve Lucco, Daniel Rosenwasser, Pierce Boggan, Umesh Madan, Mike Hopcroft, 和 Gayathri Chandrasekaran
在过去的几个月里,我们看到最新一波大型语言模型引发了极大的热情。虽然聊天助手是最直接的应用,但如何将这些模型最好地集成到现有应用界面中是一个大问题。
换句话说,我们如何用自然语言界面“增强”传统 UI?我们如何使用 AI 将用户请求转化为我们的应用可以操作的东西?我们又如何确保我们的应用安全,并完成开发人员和用户都可以信任的工作?
今天,我们发布 TypeChat,这是一个旨在回答这些问题的实验性库。它使用代码库中的类型定义来检索类型安全的结构化 AI 响应。
您可以通过运行以下命令立即开始使用 TypeChat:
npm install typechat
并将其与任何语言模型连接起来,以便与您的应用协同工作。
但我们首先快速探讨一下 TypeChat 存在的原因。
修饰与解析
当前 LLM 的默认是会话式“自然”语言——人类用来交流的语言,如英语。解析自然语言是一项极其困难的任务,无论您用“以项目符号列表形式响应”之类的规则如何修饰提示。自然语言可能具有结构,但对于典型的软件来说,很难从原始文本中重建它。
令人惊讶的是,我们可以要求 LLM 以 JSON 形式响应,它们通常会返回一些合理的内容!
用户
将以下请求翻译成 JSON。
我能要一个蓝莓松饼和一杯大杯拿铁吗?
仅以如下 JSON 形式回应
{ "items": [ { "name": "croissant", "quantity": 2 }, { "name": "latte", "quantity": 1, "size": "tall" } ] }
聊天机器人
{ "items": [ { "name": "blueberry muffin", "quantity": 1 }, { "name": "latte", "quantity": 1, "size": "grande" } ] }
这很好——尽管这个例子展示了最好的响应。虽然例子可以帮助指导结构,但它们没有广泛定义 AI 应该返回什么,也没有提供我们可以验证的东西。
只需添加类型!
幸运的是,类型 正是做到了这一点。我们发现,由于 LLM 在野外见过许多类型定义,类型也成为了 AI 应如何响应的绝佳指南。因为我们通常使用 JSON — JavaScript 对象表示法 — 而且它与我们的内心非常紧密,所以我们在提示中一直使用 TypeScript 类型。
用户
将以下请求翻译成 JSON。
我能要一个蓝莓松饼和一杯大杯拿铁吗?
仅以满足
Response
类型的 JSON 形式回应type Response = { items: Item[]; }; type Item = { name: string; quantity: number; size?: string; notes?: string; }
聊天机器人
{ "items": [ { "name": "blueberry muffin", "quantity": 1 }, { "name": "latte", "quantity": 1, "size": "grande" } ] }
这非常棒!TypeScript 已经证明它非常适合精确描述 JSON。但是当语言模型出错并生成一个不符合我们类型的响应时会发生什么呢?
好吧,因为这些类型是有效的 TypeScript 代码,我们可以使用 TypeScript 编译器本身来验证响应!事实上,来自编译器的错误反馈甚至可以用来指导修复。综合起来,我们可以获得一个健壮的过程,用于获取格式良好的响应,我们的应用程序可以进一步处理、与用户验证等等。
换句话说,类型就是你所需要的一切。
介绍 TypeChat
结合人类提示和“响应模式”的技术不一定是独一无二的——但它很有前景。当我们专注于将用户意图转换为结构化数据时,我们发现 TypeScript 非常适合这项任务。我们对这种方法越来越有信心,为了验证它,我们发布了一个名为 TypeChat 的库,以帮助您更轻松地在您的应用程序中使用它。TypeChat 已经在 npm 上发布,如果您想立即尝试它,它提供了用于提示原型设计、模式验证、修复等工具。
这是将 TypeChat 连接到 LLM 并判断句子是消极、中性还是积极的基本代码。
// ./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 可以通过多种不同的方式使用。我们到目前为止在这里讨论的方式都是关于使用“数据模式”将一些用户意图转化为结构化响应;但是,TypeChat 也使得使用“API 模式”来构建基本程序成为可能。我们有一些文档和示例,让您了解使用 TypeChat 的不同方式。
开放且可插拔
首先,TypeChat 是开源的。我们采用 MIT 许可证,您可以在 GitHub 上找到我们,我们渴望听到您的想法,分享我们的创意,并与您一起构建。
其次,TypeChat 的构建方式旨在与模型无关。虽然为了方便,我们与 OpenAI API 和 Azure OpenAI 服务有一些非常基本的集成,但这种方法应该适用于您想要使用的任何聊天完成式 API——尽管请注意,目前 TypeChat 最适合同时接受散文和代码训练的模型。
今天就来试试吧!
我们很想知道 TypeChat 是否对您有用和感兴趣!正如我们所说,如果您有任何问题、建议等,我们将在 GitHub 欢迎您。
编码愉快!