跳到主要内容
TypeChat

引言

大型语言模型(或称 LLM)可以为我们的请求提供令人惊讶的丰富答案。也许你曾尝试与语言模型聊天,并对其作为头脑风暴工具的有效性感到高兴。

用户

西雅图下雨了(真意外!)。给我3个这个周末应该做的事情的快速建议?简短直接。

ChatGPT

  1. 参观西雅图艺术博物馆(SAM),度过充满艺术灵感和探索的一天。
  2. 在当地咖啡馆享受一个舒适的下午,品尝你最喜欢的咖啡,并沉浸在一本好书中。
  3. 通过驾车前往斯诺夸尔米瀑布来拥抱雨天,欣赏雄伟瀑布的壮丽景色。

这些模型本身就是出色的聊天助手,但它们能用来为应用程序添加自然语言接口吗?我们许多人看到的答案是“是的——某种程度上”,这真的取决于我们如何向模型提问。

添加结构

请记住,默认情况下,这些模型以自然语言响应,即我们今天阅读和写作的方式;但传统程序在处理这些答案方面表现不佳。大多数软件期望处理字节、字符、JSON blob 等层面的结构——而不是英语这样的自然语言。当我们没有结构时,我们必须解析出我们感兴趣的内容,这可能并不总是实用的。

一种添加一些结构并使解析更容易的方法可能是请求一个答案列表

用户

在下雨天,提供3个在西雅图可以去的具体地方的建议。以项目符号列表的形式回应。要简洁。

ChatGPT

  • 西雅图艺术博物馆:探索丰富的艺术收藏品,欣赏室内展览。
  • 奇胡利玻璃艺术园:在一个有顶棚的花园和画廊中欣赏戴尔·奇胡利令人惊叹的玻璃艺术品。
  • 太平洋科学中心:参与互动展览、天文馆表演和IMAX电影,度过充满教育乐趣的一天。

也许一个项目符号列表就足够了,但我们如何分解这些数据呢?去除开头的项目符号,并用": "分隔场地和描述吗?如果场地名称中包含": "怎么办?事实证明,我们仍然面临解析自然语言的问题。

那么,如果我们要求模型以更结构化的格式(如 JSON)响应会怎样?事实上,许多语言模型都擅长生成 JSON!

用户:提供3个在西雅图下雨天可以去的具体地点的建议。以 JSON 形式回应。JSON 应具有以下格式

[
    { "venue": "...", "description": "..." },
    { "venue": "...", "description": "..." }
]

ChatGPT

[
    {
        "venue": "Seattle Art Museum",
        "description": "The Seattle Art Museum (SAM) is a world-class museum with a diverse collection of art from around the globe. It offers a great indoor activity for a rainy day, allowing you to explore various art exhibitions and displays, including contemporary art, African and Oceanic art, and European painting and sculpture."
    },
    {
        "venue": "Chihuly Garden and Glass",
        "description": "Chihuly Garden and Glass is an extraordinary exhibition showcasing the breathtaking glass artwork of Dale Chihuly. Located at the Seattle Center, this indoor attraction offers a mesmerizing experience as you wander through vibrant glass sculptures and installations. The beautiful interplay of light and color will captivate your senses, making it a perfect rainy day destination."
    },
    {
        "venue": "Museum of Pop Culture",
        "description": "The Museum of Pop Culture (MoPOP) is a vibrant museum dedicated to contemporary pop culture, music, science fiction, and more. It features engaging exhibits that celebrate music icons, explore science fiction themes, and delve into the world of video games. Whether you're a fan of music, movies, or pop culture in general, MoPOP offers an immersive and entertaining experience, making it an ideal choice on a rainy day."
    }
]

在这里,我们要求模型直接用 JSON 代码响应,并提供了一种“模板”或示例响应来指导其回答。如你所见,它运行得相当好!

示例响应很棒,但我们想知道是否有另一种方法。在我们的案例中,我们询问是否可以简单地用 TypeScript 类型来指导模型。

用户:提供3个在西雅图下雨天可以去的具体地点的建议。严格以 JSON 形式回应。JSON 应与以下 TypeScript 类型Response兼容

interface Response {
     data: Array<{ venue: string, description: string }>;
}

ChatGPT

{
  "data": [
    {
      "venue": "Museum of Pop Culture",
      "description": "Explore the fascinating world of popular culture through interactive exhibits, music memorabilia, and multimedia displays at the Museum of Pop Culture."
    },
    {
      "venue": "Seattle Art Museum",
      "description": "Indulge in the diverse collection of artworks from around the world at the Seattle Art Museum, featuring both contemporary and classical pieces."
    },
    {
      "venue": "Pike Place Market",
      "description": "Enjoy the vibrant atmosphere of Pike Place Market, where you can wander through covered stalls offering fresh produce, crafts, and delicious food from local vendors."
    }
  ]
}

这相当有效!尽管概念上很简单,但这是一种非常强大的方式,可以弥合自然语言与应用程序可以处理的内容之间的鸿沟。但我们希望尽可能简化使用这种模式,并消除语言模型响应的一些不足之处。

这是 TypeChat 背后的核心思想。通过简单地给模型一个模式(一些类型)和一个请求,我们可以将自然语言集成到应用程序中,并通过类型良好的结构化数据进行处理。

介绍 TypeChat

TypeChat 使使用类型构建自然语言接口变得容易。

只需定义表示你的自然语言应用程序支持的意图的类型即可。这可以像一个用于情感分类的接口一样简单,也可以是更复杂的示例,例如用于购物车或音乐应用程序的类型。例如,要向模式添加其他意图,开发人员可以使用类型组合添加意图,例如将其他类型添加到区分联合中。为了使模式具有层次性,开发人员可以使用“元模式”根据用户输入选择一个或多个子模式。

定义类型后,TypeChat 会通过以下方式处理其余部分:

  1. 使用类型构建对 LLM 的提示。
  2. 验证 LLM 响应是否符合模式。如果验证失败,则通过进一步的语言模型交互修复不符合的输出。
  3. 简洁地总结实例(不使用 LLM),并确认它与用户意图一致。

类型就是你所需要的一切!