TypeChat,用TypeScript快速接入AI大语言模型

news2024/12/23 4:36:50

TypeChat是C# 和 TypeScript 之父 Anders Hejlsberg全新的开源项目。使用AI在自然语言和应用程序和API之间建立桥梁,并且使用TypeScript。

现在出现了很多大型语言模型,但是如何将这些模型最好地集成到现有的应用程序中,如何使用人工智能来接受用户请求并转化为我们的应用程序可以运行的内容,并且确保我们的程序是安全的,可以信任的?

TypeChat 就是为了解决这样的问题。通过编写TypeScript类型定义,而不是自然语言提示来指导语言模型提供类型良好的结构化的响应数据,用schema替代prompt。


准备工作

  1. TypeChat默认是使用openAI或者Azure openAI的api,需要提前准备好,这里我使用Azure openAI的api(比较好申请且不会被封)。如果不使用openAI可以自己实现替换,这里暂时先用openAI

  2. 安装typechat依赖

    pnpm install typechat
    
  3. 在根目录下.env配置openai的key

AZURE_OPENAI_ENDPOINT=https://YOUR_RESOURCE_NAME.openai.azure.com/openai/deployments/YOUR_DEPLOYMENT_NAME/chat/completions?api-version=2023-05-15
AZURE_OPENAI_API_KEY=Your Azure OpenAI API key

# OPENAI_MODEL=The OpenAI model name (e.g. `gpt-3.5-turbo` or `gpt-4`)
# OPENAI_API_KEY=Your OpenAI API key

通过自然语言请求掘金文章列表的Demo

  1. 定义Schema,这就是希望模型将自然语言按照定义的类型为约束,生成结构化的响应数据
// 定义排序类型,按照推荐or最新
export type SortType = "recommend" | "latest";

// 定义文章类型
export type ArticleType = "frontend" | "backend" | "android" | "ios" | "ai";

// 定义函数,获取文章列表
export type API = {
  getArticles(
    sortType: SortType,
    limit: number,
    categoryId?: ArticleType
  ): void;
};
  1. 自然语言请求并解析
import {
  createLanguageModel,
  processRequests,
  createProgramTranslator,
  evaluateJsonProgram,
  getData,
} from "typechat";

// 根据环境变量的配置,创建语言模型,
// typechat为了简化依赖,所以没有用azure或者openai的sdk,而直接通过url接口请求
// 如果不使用openai的模型也可以通过TypeChatLanguageModel接口实现自己的LLM交互
const model = createLanguageModel(process.env);
// 读取上一步定义的模型文件
const schema = fs.readFileSync(
  join(dirname(fileURLToPath(import.meta.url)), "Schema.ts"),
  "utf8"
);

// 创建一个对象,该对象可以将自然语言请求转换为程序,以JSON的形式展现,由上一步定义的API组成函数
const translator = createProgramTranslator(model, schema);

// 以交互方式或从命令行上指定的输入文件处理请求
processRequests("说你想干嘛--->", process.argv[2], async (request) => {
	// 将自然语言请求转换为T类型的对象。
  const response = await translator.translate(request);
  if (!response.success) {
    return;
  }
  const program = response.data;

  // 将JSON转换为TypeScript代码以进行验证。
  // 如果转换成功,则返回一个Success<string>对象;如果JSON无法转换,则返回Error对象。
  console.log(getData(translator.validator.createModuleTextFromJson(program)));

  /**
   * 使用简单的解释器评估JSON程序。函数调用会被传递给第二个参数onCall回调函数进行调度。
   * @param program 要评估的JSON程序
   * @param onCall 用于处理程序中函数调用的回调函数
   * @returns 返回一个promise
   */
  const result: any = await evaluateJsonProgram(program, handleCall);

  console.log(`Result: ${result}`);
});

const handleCall = async (func: string, args: any[]): Promise<any> => {
  // 对解析后的函数和参数进行处理,并返回一个promise
	// 请求掘金api并获取响应数据返回结果.....
  return
};

完整代码在https://github.com/zhaomengfan/typechat-example


启动任务,出现交互输入,这里就是输入需要解析的自然语言

1.png

输入”看些新文章”,运行一步步打印结果

// 得到自然语言解析后的转换的对象 program
{
  "@steps": [
    {
      "@func": "getArticles",
      "@args": [
        "latest",
        10
      ]
    }
  ]
}

// createModuleTextFromJson将JSON转换为TypeScript代码以进行验证,
// 返回的TypeScript源代码为ECMAScript模块,该模块从“./schema”导入一个或多个类型,
// 并以适合TypeScript编译器进行类型检查的方式将这些类型与JSON对象的表示形式组合在一起
import { API } from "./schema";
function program(api: API) {
  return api.getArticles("latest", 10);
}

//evaluateJsonProgram评估program并且,将解析后的func,args作为参数传给onCall
// handleCall获取下面的func和args后进行相应处理并返回结果,这里是去请求接口

// func
getArticles 
// args
[ 'latest', 10 ]

最后得到结果

2.png


再尝试一个例子,输入“我想看看前端推荐的内容”,并执行得到结果

// program
{
  "@steps": [
    {
      "@func": "getArticles",
      "@args": [
        "recommend",
        10,
        "frontend"
      ]
    }
  ]
}

// createModuleTextFromJson
import { API } from "./schema";
function program(api: API) {
  return api.getArticles("recommend", 10, "frontend");
}

// evaluateJsonProgram
// func
getArticles 
// args
[ 'recommend', 10, 'frontend' ]

3.png

以上就是一个简单的示例,根据自然语言,并根据定义的Schema解析为类型安全的结构化数据,并且根据解析的结果去进行相应的请求获取文章列表。

官方网站也提供了一些示例可以体验一下https://microsoft.github.io/TypeChat/docs/examples/

总结:

TypeChat让我们能轻松地使用 TypeScript 类型来引导模型,可以安全的将大语言模型集成到现有的应用程序中,可以探索很多新的产品形式。
不过因为刚开源TypeChat也不是很完善,比如目前还不能对话交互。

总之,这是一个对熟悉TypeScript的你来说一个轻松使用大语言模型连接应用程序的方式,大家可以多尝试尝试,并持续关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/788347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式||工厂模式(含有代码样例)

什么是工厂模式&#xff1f; 工厂模式&#xff08;Factory Pattern&#xff09;是一种常见的创建型设计模式&#xff0c;它提供了一种封装对象创建过程的方式。工厂模式通过定义一个创建对象的接口&#xff0c;但具体的对象创建在子类中实现&#xff0c;这样可以将对象的实例化…

Docker系列 1 - 镜像和容器

Docker系列 1 - 镜像和容器 1、关于 Docker2、镜像 image3、容器 container 1、关于 Docker docker官网&#xff1a;http://www.docker.com docker中文网站&#xff1a;https://www.docker-cn.com/ Docker Hub 仓库官网: https://hub.docker.com/ Docker 的基本组成&#…

【C++】多态原理剖析,Visual Studio开发人员工具使用查看类结构cl /d1 reportSingleClassLayout

author&#xff1a;&Carlton tag&#xff1a;C topic&#xff1a;【C】多态原理剖析&#xff0c;Visual Studio开发人员工具使用查看类结构cl /d1 reportSingleClassLayout website:黑马程序员C tool&#xff1a;Visual Studio 2019 date&#xff1a;2023年7月24日 目…

电脑记事本在哪里?电脑桌面显示记事本要怎么设置?

绝大多数上班族在使用电脑办公时&#xff0c;都需要随手记录一些琐碎或重要的事情&#xff0c;例如工作注意事项、常用的文案、某项工作的具体要求、多个平台的账号和密码等。于是就有不少小伙伴想要使用电脑记事本软件来记录&#xff0c;那么电脑记事本在哪里呢&#xff1f;想…

VM虚拟机网络配置桥接模式方法步骤

VM虚拟机配置桥接模式&#xff0c;可以让虚拟机和物理主机一样存在于局域网中&#xff0c;可以和主机相通&#xff0c;和互联网相通&#xff0c;和局域网中其它主机相通。 vmware为我们提供了三种网络工作模式&#xff0c;它们分别是&#xff1a;Bridged&#xff08;桥接模式&…

C# | [极坐标] 与 [平面直角系坐标] 的相互转换

极坐标与平面直角系坐标的相互转换方法及C#代码实现 文章目录 极坐标与平面直角系坐标的相互转换方法及C#代码实现前言极坐标转换为平面直角系坐标计算公式示例代码运行结果 平面直角系坐标转换为极坐标计算公式示例代码运行结果 结束语 前言 极坐标和平面直角系坐标是常见的坐…

细胞生物学试剂UAMC1110,FAP-IN-1,相关数据特点说明

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ UAMC1110&#xff0c;FAP-IN-1&#xff0c;(S)-N-[2-(2-氰基-4,4-二氟-1-吡咯烷基)-2-氧代乙基]喹啉-4-甲酰胺 Product structure&#xff1a; Product specifications&#xff1a; 1.CAS No&#xff1a;N/A 2.Molecular f…

[Cotex-M3学习教程]-0.1-Cortex-M3概述

目录 1 Cortex-M3概述 1.1 ARM 处理器 1.2 cortex-M3介绍 1.3 cortex-M3结构概览图 1.4 cortex-M3组件 1.4.1 内核系统 1.4.2 NVIC 1.4.3 寄存器组 控制寄存器&#xff08;CONTROL&#xff09; 程序计数寄存器&#xff08;PC:R15&#xff09; 堆栈指针寄存器&#xf…

基于Javaweb实现ATM机系统开发实战(十四)交易记录分页实现

还是老规矩&#xff0c;先看前端页面查看需要传递哪些参数&#xff0c;并且把逻辑有问题的部分进行修改~ <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri&qu…

智能照明的特点及控制系统的实际案例分享

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 智能照明控制系统是利用先进电磁调压及电子感应技术&#xff0c;以公共照明统一格智能为平台&#xff0c;对供电进行实时监控与跟踪&#xff0c;自动平滑地调节电路的电压和电流幅度&#xff0c;改善照明电路中不平衡负荷所带来的额外功…

c++11/c++98动态规划入门第5课,经典DP问题 --- 区间

第1题 取数问题 查看测评数据信息 有一排N个数&#xff0c;你和小明2个人玩游戏&#xff0c;每个人轮流从2端取数&#xff0c;每次可以从左或右取&#xff0c;不能从中间取。你取的所有的数的和是你的得分&#xff0c;小明取的所有的数的和是小明的得分。如果你先取&#x…

【MySQL】MySQL HeatWave 介绍

HeatWave是一个分布式、可扩展、无共享、内存中、混合柱状的查询处理引擎&#xff0c;专为获得极致性能而设计。可以通过向MySQL数据库系统添加一个HeatWave集群来启用它。 HeatWave 是一种大规模并行、高性能内存查询加速器&#xff0c;可将分析工作负载、混合工作负载和机器…

5.string变量-读取一行

C里面的读一行的用法。getline&#xff08;cin,addr&#xff09;; 从标准输入设备cin&#xff0c;读取一行字符串保存到字符串变量addr中 如果用户直接回车什么都不读取就没有任何数据输入 读一行直到遇到回车符&#xff0c;注意不包括回车符。 判断字符串是不是空的 addr.em…

学生管理系统-06Echarts

一、Echarts简介 1、什么是echarts ECharts是一款基个基于 JavaScript 的开源可视化图表库 官网地址&#xff1a;Apache ECharts 国内镜像&#xff1a;ISQQW.COM x ECharts 文档&#xff08;国内同步镜像&#xff09; - 配置项 示例&#xff1a;echarts图表集 2、第一个E…

[面试官,你坐好],今天我给你吹下卡顿监控

这是一篇面试总结稿&#xff0c;根据之前的面试过程以一种模拟面试的风格进行阐述。 面试官: 自我介绍下 诶&#xff1f;这面试官头发还比较多&#xff0c;应该不牛逼&#xff0c;心里踏实了不少。我: 面试官你好&#xff0c;我叫**&#xff0c;5年工作经验。曾经跟OPPO产品PK&…

Alchemy Catalyst 2023 Crack

Alchemy Catalyst 2023 Crack Alchemy CATALYST是一个可视化的本地化环境&#xff0c;支持本地化工作流程的各个方面。它帮助组织加快本地化进程&#xff0c;比竞争对手更快地进入新市场&#xff0c;并为他们创造新的收入机会。 创建全球影响力 高质量的产品和服务翻译对跨国组…

人才缺口将达 6.7 万人?半导体行业“后继无人”,美国危?

根据美国半导体行业协会&#xff08;SIA&#xff09;和牛津经济研究所&#xff08;Oxford Economics&#xff09;联合编制的一项研究报告指出&#xff0c;到2030年&#xff0c;美国半导体行业预计面临约6.7万名人才缺口。 根据预测&#xff0c;到2029年底&#xff0c;美国芯片行…

1.Flink概述

1.1 技术架构 应用框架层: 在API层之上构建的满足特定应用场景的计算框架&#xff0c;总体上分为流计算和批处理两类应用框架。API 层&#xff1a; Flink对外提供能力的接口 &#xff0c;实现了面向流计算的DataStream API和面向批处理的DataSet API。运行时层&#xff1a;Flin…

基于Java+SpringBoot+vue前后端分离小徐影城管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

标准IO函数练习

一、实现登录功能。 自定义一个usr.txt&#xff0c;手动输入账户密码&#xff0c;格式如下&#xff1a;账户 密码 例如&#xff1a; zhangsan 12345 lisi abcde wangwu abc123 需求如下&#xff1a; 从终端获取账户密码&#xff0c;与文件中的账户密码比较若终端输入的账户…