AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出

Typescript 之父(微软)在 7月 21 号发布了一个风趣的项目—— Typechat。旨在运用 AI 来衔接自然言语和运用的 Schema / API。说白话便是运用 Typescript 类型信息来约束 ChatGPT 输出内容的结构。

咱们早已见证过 ChatGPT 的强壮,假如想要对接到咱们已有的软件体系,通常会要求它输出 JSON 这类形式化、结构化的数据。假如你调教过 ChatGPT 就会发现, 它的输出成果往往没那么靠谱。为了让它输出契合要求的内容,咱们需求给出满足的上下文信息和示例,并且这个调教进程也比较形而上学。

本文就来看看 Typechat 是如何让 ChatGPT 输出契合需求的内容


ChatGPT 的才能和缺点

ChatGPT 看起来很拿手处理代码

AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出

扮演一个 linux 终端


AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出

扮演一个 Javascript 执行器


AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出

扮演 Typescript


这能说明 ChatGPT 的预练习会集包含了丰富的编程言语相关的内容。




连续对话和纠错机制

AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出

众所周知, ChatGPT 生成的内容存在必定的随机性和不安稳性,很难一步到位。读者们作为开发者咱们经常运用它来生成代码,应该能够体会到。

这个问题怎样解决呢?大概有以下几个方向

  • 能够和 ChatGPT 连续对话,引导它,反诘它、纠正它
  • 给 ChatGPT 供给更具体的上下文信息
  • 运用一些对话的技巧:Chain of thought, 让 ChatGPT 学习推理的进程
  • 模型微调。

终究是平常心,敞开地对待, AI 不是无所不能的,咱们或许竭尽的所有技巧, 也或许无法令人满意的答案。



DSL 输出

假如咱们想要让 AI 衔接到其他生态,比方衔接到软件体系、控制硬件设备、完成各种自动化流程,在现在这个阶段,咱们需求让 ChatGPT 输出结构化的数据,比方 JSON、XML、或许其他常见的 DSL。

AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出

就像咱们开头说的 “ Typechat 旨在运用 AI 来衔接自然言语和运用的 Schema / API”, 结合上面的流程图理解,你应该就能体会到这句话的意思。AI 在这里便是一个衔接者,让用户能够运用自然言语和咱们的运用体系进行交互,AI 在这里的职责便是将自然言语翻译为咱们运用体系能够处理的 DSL


ChatGPT 现已具有这样的才能:

AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出

制作 mermaid 流程图


AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出

输出 JSON


假如你要求输出更杂乱的数据结构,则需求运用 Few-shot Prompt 等手法,在受限的 Token 范围内,给 ChatGPT满足的事例和上下文信息

除此之外,OpenAI 官方在 613 版别的 GPT 3.5 和 4 带来了函数调用的才能(Function Calling), 能够协助开发者经过 API 方式完成相似于 ChatGPT 插件的数据交互才能。让开发者能够运用 JSON Schema 来描述你的函数接口,GPT 会依据用户的输入,决议调用哪个函数,并组装契合 Schema 要求的 JSON 数据。

以下是 OpenAI 的官方示例:


    #  函数接口界说
    functions = [
        {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    },
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location"],
            },
        }
    ]
    #  用户输入
    messages = [{"role": "user", "content": "What's the weather like in Boston?"}]
    # 调用
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-0613",
        messages=messages,
        functions=functions,
        function_call="auto",  # auto is default, but we'll be explicit
    )
    response_message = response["choices"][0]["message"]
    #  GPT 会告诉你终究需求调用哪个函数以及它的参数,也或许不会调用任何东西
    if response_message.get("function_call"):

gpt-3.5-turbo-0613、gpt-4-0613 针对 Function calling 这种场景做了微调,实际上这些 ‘函数’ 也是注入到 system prompt 里面,同样会占用恳求的 Token。在旧的版别理论上也能够完成相似的效果。我会在后续的文章中专门介绍 Function calling。


实际上,Function Calling 仍是不完美,比方无法确保严厉依照咱们给定的 JSON Schema 输出,不支持杂乱的 JSON Schema,缺乏灵敏性等等。现在咱们开始介绍本文的主角 —— typechat




TypeChat

TypeChat 是微软刚发布一个风趣的项目,不同于 Function calling, 它运用 Typescript 类型来作为 「Schema」,要求 ChatGPT 回来契合这个类型界说的数据。

Typechat 中,先界说好 ChatGPT 的响应类型,即 Schema, 例如:

type Response = {
    items: Item[];
};
type Item = {
    name: string;
    quantity: number;
    size?: string;
    notes?: string;
}

要求 ChatGPT 回来 JSON 格局,并契合上述的 Response 类型。接着输入用户需求

Could I get a blueberry muffin and a grande latte?

终究 ChatGPT 回来成果:

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



那么它是怎样作业的?咱们在上一节对 ChatGPT 的才能做了大概的剖析,你能够将它们结合起来想想:

  • ChatGPT 拿手扮演“代码”执行器, 这其中也包含 Typescript
  • ChatGPT 的缺点便是不安稳、随机性。解决办法就给出更多的信息、推理过程,经过连续对话、反复纠正它。
  • ChatGPT 经过给出满足的指示,能够输出‘契合’需求的结构化数据。



Typechat 便是运用了上述思路:

AI 调教师:聊聊 TypeChat 以及ChatGPT 形式化输出

  • 将类型界说和用户需求一起投喂给 ChatGPT,要求它回来指定类型的 JSON数据
  • 将回来的数据喂给 Typescript 进行检查
  • 假如类型过错,将过错成果丢回 ChatGPT,从头纠正


它的 Prompt 非常简略。 恳求的 Prompt:

  function createRequestPrompt(request: string) {
        return `You are a service that translates user requests into JSON objects of type "${validator.typeName}" according to the following TypeScript definitions:\n` +
            `\`\`\`\n${validator.schema}\`\`\`\n` +
            `The following is a user request:\n` +
            `"""\n${request}\n"""\n` +
            `The following is the user request translated into a JSON object with 2 spaces of indentation and no properties with the value undefined:\n`;
   }

纠错 Prompt:

function createRepairPrompt(validationError: string) {
        return `The JSON object is invalid for the following reason:\n` +
            `"""\n${validationError}\n"""\n` +
            `The following is a revised JSON object:\n`;
    }

翻译流程:

async function translate(request: string) {
        let prompt = typeChat.createRequestPrompt(request);
        let attemptRepair = typeChat.attemptRepair;
        while (true) {
            const response = await model.complete(prompt);
            if (!response.success) {
                return response;
            }
            const responseText = response.data;
            const startIndex = responseText.indexOf("{");
            const endIndex = responseText.lastIndexOf("}");
            if (!(startIndex >= 0 && endIndex > startIndex)) {
                return error(`Response is not JSON:\n${responseText}`);
            }
            const jsonText = responseText.slice(startIndex, endIndex + 1);
            //  类型检查
            const validation = validator.validate(jsonText);
            if (validation.success) {
                return validation;
            }
            if (!attemptRepair) {
                return error(`JSON validation failed: ${validation.message}\n${jsonText}`);
            }
            //  修复
            prompt += `${responseText}\n${typeChat.createRepairPrompt(validation.message)}`;
            attemptRepair = false;
        }
    }

Typechat 与 Function calling 对比:

  • Typescript 能够更简练、灵敏地界说杂乱的数据类型;
  • Typechat 也加入了简略的纠错机制,进一步确保成果的可靠性

它们都改动不了 ChatGPT 的特性,成果仍然不必定是可靠的。目前 Typechat 只要一轮纠正,其实际的效果、Token 消耗量等还有待验证。





总结

上面咱们简略介绍了 ChatGPT 的一些特性和缺点。接着引入了 Typechat,它给咱们供给了一个较新的思路:运用 Typescript 类型来界说 ChatGPT 的输出结构,然后经过 Typescript 来验证输出成果,循环纠正 ChatGPT。

本文的关键

  • ChatGPT 看起来很拿手处理编程言语。比方 Typescript,这就给 Typechat 的完成奠定了基础。
  • 运用 Typescript 类型作为 Schema,这自身就能够给 ChatGPT 供给较为严谨的上下文信息。
  • ChatGPT 的答复是随机的、不安稳,很难做到一步到位。在实际运用中,需求经过多次对话和纠正才能得到较为完善的成果。所以 Typechat 就引入了自动纠错机制,让 ChatGPT 输出愈加安稳。
  • 编程言语是严苛的,具有可‘纠错性’。咱们能够将代码过错信息反馈给 ChatGPT 来完善答案。Typechat 便是利用了这点,其他编程言语也能够轻松完成相似的效果,很快其他言语应该也会有相似的库出来

扩展阅览

  • github.com/microsoft/T…