在过去的几个月里,我们看到了最新一波大型语言模型的热潮。虽然聊天助手是最直接的应用程序,但如何最好地将这些模型集成到现有的应用程序界面中仍是一个大问题。
换句话说,我们如何用自然语言界面增强传统UI ? 我们如何使用人工智能来接受用户的请求,并将其转化为我们的应用程序可以操作的东西? 我们如何确保我们的应用程序是安全的,并做开发者和用户都可以信任的工作?
因此我们发布了TypeChat,一个旨在回答这些问题的实验性库。它使用代码库中的类型定义来检索类型安全的结构化AI响应。
今天你可以通过运行以下命令开始使用TypeChat
npm install typechat
并将它与任何语言模型连接起来,与你的应用一起工作。
但让我们首先快速探索一下TypeChat存在的原因。
当前的大语言模型浪潮默认使用会话式自然语言进行交流。解析自然语言是一项极其困难的任务,无论您如何用“以项目列表的形式响应”之类的规则来给予提示。自然语言可能有结构,但典型的软件很难从原始文本中重建它。
令人惊讶的是,我们可以要求大语言模型以JSON的形式响应,他们通常会以合理的方式响应!
用户:
将以下请求转换为JSON。
Could I get a blueberry muffin and a grande latte?
只以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应该返回什么,也不能提供我们可以验证的任何内容。
幸运的是,类型正是这样做的。我们发现,因为大语言模型已经在网络上看到了如此多的类型定义,类型也可以作为人工智能应该如何响应的一个很好的指南。因为我们通常使用JSON (JavaScript Object Notation, JavaScript对象表示法),也因为它与我们非常亲近,所以我们一直在提示符中使用TypeScript类型。
用户:
将以下请求转换为JSON。
Could I get a blueberry muffin and a grande latte?
只响应满足?
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编译器来验证响应。事实上,编译器的错误反馈甚至可以用来指导修复。当整合在一起时,我们可以得到一个健壮的过程来获得类型良好的响应,我们的应用程序可以进一步修正,与用户进行验证等。
换句话说,类型就是您所需要的。
将人类提示和“反应模式”结合起来的技术不一定是独一无二的,但它很有前途。当我们专注于将用户意图转换为结构化数据时,我们发现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上提给我们。
Happy Hacking!
欢迎关注公众号:文本魔术,查看TypeScript产品主管Daniel Rosenwasser带来的TypeChat介绍视频
?