当前位置: 首页 > news >正文

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

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的你来说一个轻松使用大语言模型连接应用程序的方式,大家可以多尝试尝试,并持续关注。

相关文章:

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

TypeChat是C# 和 TypeScript 之父 Anders Hejlsberg全新的开源项目。使用AI在自然语言和应用程序和API之间建立桥梁&#xff0c;并且使用TypeScript。 现在出现了很多大型语言模型&#xff0c;但是如何将这些模型最好地集成到现有的应用程序中&#xff0c;如何使用人工智能来接…...

Dcoker compose单机容器集群编排管理

目录 一、概述 二、compose 部署 lnmp 1.Docker Compose 环境安装 2.YAML 文件格式及编写注意事项 3.Docker Compose配置常用字段 4.Docker Compose 常用命令 5. 配置lnmp集群依赖文件 6.修改docker-compose.yml文件 7.根据yml文件创建lnmp容器 一、概述 Docker compos…...

P5635 【CSGRound1】天下第一(记忆化搜索)

用short类型二维数组防止MLE。这里用的记忆化搜索&#xff0c;如果f[x][y]已经有值了&#xff0c;直接返回这个值。判断error的方法&#xff1a;如果下一次又访问到它&#xff0c;说明出现了循环&#xff0c;这样是永远%不到0的&#xff0c;所以&#xff0c;第一次访问一次f[x]…...

如何维护你的电脑:提升性能和延长使用寿命

如何维护你的电脑&#xff1a;提升性能和延长使用寿命 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…...

Docker续集+Docker Compose

目录 Containerd与docker的关系 runCrunC与Containerd的关联 OCI协议Dockerfile多阶段构建&#xff08;解决&#xff1a;如何让一个镜像变得更小 &#xff09;多阶段构建Images瘦身实践.dockerignore Docker Compose快速开始Quick StartCompose 命令常用命令命令说明 Compose 模…...

k8s deployment(k8s经典版)|PetaExpress

Deployment是什么&#xff1f; Deployment是指在软件开发中将应用程序或系统部署到目标环境中的过程。它包括将代码编译、配置、打包并安装到目标服务器或设备上的步骤。k8s deployment是&#xff08;k8s经典版&#xff09;中用来管理发布的控制器&#xff0c;在开发的过程中使…...

uni-app如何生成正式的APK

第一步&#xff1a; 进入dcloud官网https://dcloud.io/&#xff0c;点击开发者后台进入登录注册页面 第二步&#xff1a;登录之后跳到项目列表&#xff0c;选择自己想要打包的项目 点击进去如果没有生成证书&#xff0c;点击生成证书&#xff0c;如果显示证书已生成就不用管了…...

低代码开发平台源码:可视化敏捷开发工具,拖拽式自定义表单界面

低代码开发平台源码 低代码管理系统源码 无需代码或通过少量代码就可以快速生成应用程序的开发平台。 本套低代码管理后台可以支持多种企业应用场景&#xff0c;包括但不限于CRM、ERP、OA、BI、IoT、大数据等。无论是传统企业还是新兴企业&#xff0c;都可以使用管理后台快速构…...

利用读时建模等数据分析能力,实现网络安全态势感知的落地

摘要&#xff1a;本文提出一种基于鸿鹄数据平台的网络安全态势感知系统&#xff0c;系统借助鸿鹄数据平台读时建模、时序处理、数据搜索等高效灵活的超大数据存储和分析处理能力&#xff0c;支持海量大数据存储、分类、统计到数据分析、关联、预测、判断的网络安全态势感知能力…...

六、代理模式

文章目录 一、代理模式1、代理模式的好处和缺点1.1 代理模式理解加深 一、代理模式 为什么要学习代理模式&#xff1f; 代理模式是Spring AOP 以及 Spring MVC 的底层&#xff01;&#xff01;并且还是 JAVA 的23种设计模式之一&#xff01;&#xff01; 代理模式的分类&#…...

Easy Glide

题意&#xff1a;给出起点终点坐标&#xff0c;然后给出可以经过的几个点&#xff0c;未经过这几个点的时候以v1的速度前进&#xff0c;一旦经过这些点就可以在3秒内以v2的速度前进&#xff0c;3秒之后恢复v1&#xff0c;问从起点到终点所需的最短时间 思路&#xff1a;最短路…...

ppt怎么压缩到10m以内?分享好用的压缩方法

PPT是一种常见的演示文稿格式&#xff0c;有时候文件过大&#xff0c;我们会遇到无法发送、上传的现象&#xff0c;这时候简单的解决方法就是压缩其大小&#xff0c;那怎么才能将PPT压缩到10M以内呢&#xff1f; PPT文件大小受到影响的主要因素就是以下几点&#xff1a; 1、图…...

VBA技术资料MF35:VBA_在Excel中过滤数据

【分享成果&#xff0c;随喜正能量】好马好在腿&#xff0c;好人好在嘴。不会烧香得罪神&#xff0c;不会讲话得罪人。慢慢的你就会发现&#xff0c;一颗好心&#xff0c;永远比不上一张好嘴。。 我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#…...

Debian12中为python3配置虚拟环境及在Pycharm中使用虚拟环境

在Debian 12中&#xff0c;python默认为python 3.11。 基于应用&#xff0c;现需设置虚拟环境。 1.安装venv模块 从python3.3开始&#xff0c;配置python虚拟环境&#xff0c;可用venv模块&#xff0c;更加方便了。 执行命令&#xff1a; #apt install python3.11-venv 2.…...

android app控制ros机器人一

android开发app&#xff0c;进而通过控制ros机器人&#xff0c;记录开发过程 查阅资料&#xff1a; rosjava使用较多&#xff0c;已经开发好的app也有开源的案例 rosjava GitHub https://github.com/ros-autom/RobotCA https://github.com/ROS-Mobile/ROS-Mobile-Android…...

二十章:基于弱监督语义分割的亲和注意力图神经网络

0.摘要 弱监督语义分割因其较低的人工标注成本而受到广泛关注。本文旨在解决基于边界框标注的语义分割问题&#xff0c;即使用边界框注释作为监督来训练准确的语义分割模型。为此&#xff0c;我们提出了亲和力注意力图神经网络&#xff08;A2GNN&#xff09;。按照先前的做法&a…...

webpack5 学习之路

1.视频 01-课程介绍_哔哩哔哩_bilibili 2.配套资料 依赖环境 | 尚硅谷 Web 前端之 Webpack5 教程 3.webpack 官方文档 入口起点(entry points) | webpack 中文文档 4.vue cli 官方文档 介绍 | Vue CLI 挖矿&#xff1a;Coding Tree...

VSCode C++ 调试方法

VSCode 调试 C 主要就是 .vscode 中的 launch.json 和 tasks.json 的配置。 launch.json 可以通过 vscode 界面 ——》左侧调试功能按钮——》创建 launch.json ——》C&#xff08;GDB/LLDB&#xff09;生成。 其中 launch.json 默认配置如下&#xff0c;主要配置项说明&…...

Java设计模式-命令模式

命令模式 1.命令模式含义 命令模式&#xff0c;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化。对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 命令模式乍一看&#xff0c;有点懵懵的。即使这个定义看完&#xff0c;也是不明…...

Linux编译宏BUILD_BUG_ON_ZERO

本系列文章主要写我在阅读Linux内核过程中&#xff0c;关注的比较难以理解但又设计巧妙的代码片段&#xff08;不关注OS的各个模块的设计思想&#xff0c;此部分我准备写在“深入理解Linux Kernel”系列文章中&#xff09;&#xff0c;一来通过内核代码复习一下C语言及汇编语言…...

从Arweave开始:4EVERLAND存储签入挑战开始

嗨&#xff0c;4evers&#xff0c; 今天&#xff0c;我们热烈欢迎您参加 Galxe 上的 4EVERLAND “Arweave 入门”活动。这是一项长期的重头活动&#xff0c;所有参与的用户都有机会获得相应的奖励。 Arweave 是一种革命性的去中心化存储协议&#xff0c;为寻求安全可靠的有价…...

数据结构—链表

链表 前言链表链表的概念及结构链表的分类 无头单向非循环链表的相关实现带头双向循环链表的相关实现顺序表和链表&#xff08;带头双向循环链表&#xff09;的区别 前言 顺序表是存在一些固有的缺陷的&#xff1a; 中间/头部的插入删除&#xff0c;时间复杂度为O(N)&#xf…...

windows 10/11 修改右键新建菜单

问题&#xff1a;修改右键新建菜单内容 解决方法&#xff1a;使用软件ShellNew Settings 1.打开软件 2.根据需要取消勾选项 3.最终效果...

6.修饰符

文章目录 6.1 在一个静态方法内调用一个非静态成员为什么是非法的?6.2 静态方法和实例方法有何不同 6.1 在一个静态方法内调用一个非静态成员为什么是非法的? 由于静态方法可以不通过对象进行调用&#xff0c;因此在静态方法里&#xff0c;不能调用其他非静态变量&#xff0…...

【leetcode难题】2569. 更新数组后处理求和查询【线段树实现01翻转和区间求和模版】

题目截图 题目分析 关键就是记录每次操作2时&#xff0c;nums1中的1的个数这就需要实现线段树进行区间反转以及区间求和 ac code class Solution:def handleQuery(self, nums1: List[int], nums2: List[int], queries: List[List[int]]) -> List[int]:n len(nums1)m le…...

练习时长两年半的入侵检测

计算机安全的三大中心目标是&#xff1a;保密性 (Conf idential ity) 、完整性 (Integrity) 、可用性 (Availability) 。 身份认证与识别、访问控制机制、加密技术、防火墙技术等技术共同特征就是集中在系统的自身加固和防护上&#xff0c;属于静态的安全防御技术&#xff0c;…...

【弹力设计篇】聊聊隔离设计

为什么需要隔离设计 隔离其实就是Bulkheads&#xff0c;隔板。在生活中隔板的应用主要在船舱中进行设计&#xff0c;目的是为了避免因一处漏水导致整个船都沉下去。可以将故障减少在一定的范围内&#xff0c;而不是整个船体。 从架构演变来说的话&#xff0c;大多数系统都是从…...

MFC 透明窗体

如何制作透明窗体 &#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 使用SetLayeredWindowAttributes可以方便的制作透明窗体&#xff0c;此函数在w2k以上才支持,而且如果希望直接使用的话&#xff0c;可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实…...

C++笔记之vector的resize()和clear()用法

C笔记之vector的resize()和clear()用法 code review! 文章目录 C笔记之vector的resize()和clear()用法1.resize()2.clear() 1.resize() 运行 2.clear() 运行...

Vue2基础九、路由

零、文章目录 Vue2基础九、路由 1、单页应用 &#xff08;1&#xff09;单页应用是什么 单页面应用(SPA&#xff1a;Single Page Application): 所有功能在 一个html页面 上实现具体示例: 网易云音乐 https://music.163.com/ &#xff08;2&#xff09;单页面应用VS多页面…...