跳到主要内容
TypeChat

技术

本文档定义了使用 TypeChat 的技术。

模式工程

TypeChat 用模式工程取代了提示工程:您无需编写非结构化的自然语言提示来描述所需输出的格式,而是编写 TypeScript 类型定义。这些 TypeScript 模式不一定是您的应用程序用于处理和存储数据的确切类型。相反,它们是通过控制和约束大型语言模型 (LLM) 响应的方式,在自然语言和应用程序逻辑之间建立桥梁的类型,以对您的应用程序有意义的方式。

打个比方,在模型-视图-视图模型 (MVVM) 用户界面设计模式中,视图模型在用户界面和应用程序逻辑之间建立桥梁,但它不是应用程序用于处理和存储信息的模型。您为 TypeChat 设计的模式就像视图模型,但可能更恰当地称为响应模型

为了最大程度地提高 TypeChat 的成功率,我们建议在定义响应模型类型时遵循以下最佳实践:

  • 保持简单(基本类型、数组和对象)。
  • 只使用可表示为 JSON 的类型(即不使用类)。
  • 使数据结构尽可能扁平化和规范化。
  • 在类型和属性上添加注释,用自然语言描述意图。
  • 限制泛型的使用。
  • 避免深度继承层次结构。
  • 不要使用条件类型、映射类型和索引访问类型。
  • 允许 LLM 稍作发挥(例如,使用 string 而不是字面量类型)。
  • 包含一个“逃生舱口”以抑制幻觉。

最后一点值得进一步阐述。我们发现,当响应模型试图将用户请求限制在没有回旋余地的狭窄模式中时,LLM 可能会对超出其领域的用户请求产生幻觉。例如,如果您向您的咖啡店机器人询问“两棵高大的树”,在没有其他选择的情况下,它很可能会将其转换为两杯高大的拿铁(而不会告知您它这样做了)。

然而,当您在模式中包含一个“未知”类别的逃生舱口时,LLM 会很乐意将非领域请求路由到该类别中。这不仅极大地抑制了幻觉,还为您提供了一种便捷的方式,让用户知道请求的哪些部分未被理解。TypeChat 仓库中的所有示例都使用了这种技术。