
大模型AI 应用后端【免费下载链接】TypeChatTypeChat is a library that makes it easy to build natural language interfaces using types.项目地址https://gitcode.com/gh_mirrors/ty/TypeChat点击查看免费下载导读Coffee Shop 是 TypeChat基于 TypeScript 的用类型构建自然语言界面库中极具代表性的示例它把用户随口说出的咖啡点单需求通过一个纯 TypeScript 类型 Schema 翻译成结构化的 JSON 订单对象并以UnknownText类型优雅兜底无法识别的输入。读完本文你将掌握 TypeChat 的 Schema 建模思路、完整的环境配置与运行流程以及从createJsonTranslator到 JSON 校验、失败修复的底层调用链。Coffee Shop 示例在 TypeChat 中的定位在 typescript/examples/README.md 列出的系列示例中Coffee Shop 被描述为一个咖啡店的智能代理将用户意图翻译成咖啡订单条目列表。与最基础的 Sentiment 情感分类示例TypeChat 的 hello world相比Coffee Shop 的独特价值在于对象集合建模一个自然语言句子可能包含多个商品、多个选项需要翻译成一组名词line items判别式联合类型用type字段区分商品类别与选项类别让模型可以精确地为每个 token 归类容错设计专门用UnknownText类型承接无法匹配任何已知类型的输入形成已知清单 未知兜底的双通道结构。从仓库根目录的 README.md 可以看到TypeChat 的核心主张是类型即协议把 TypeScript 类型当作 LLM 与程序之间的共享接口。Coffee Shop 就是这一主张的最小完整落地。理解 Schema订单本质是名词集合Coffee Shop 的核心思想在 typescript/examples/coffeeShop/README.md 中一句话点明将用户意图捕获为一组名词nouns这里的名词是咖啡订单中的条目合法的条目从Cart类型开始定义。顶层容器Carttypescript/examples/coffeeShop/src/coffeeShopSchema.ts 定义了整个订单的顶层结构export interface Cart { items: (LineItem | UnknownText)[]; }items是一个数组每个元素要么是可执行的订单条目LineItem要么是无法理解的内容UnknownText。这决定了模型输出永远是一组条目天然支持一句自然语言中包含多件商品。兜底类型UnknownText// Use this type for order items that match nothing else export interface UnknownText { type: unknown, text: string; // The text that wasnt understood }UnknownText是 Coffee Shop 区别于大多数 Schema 设计的关键当用户输入中出现roses are red、two lawnmowers这类与菜单无关的内容时模型不必强行把它塞进某个商品类型而是可以诚实地标注为unknown并保留原文。这意味着校验永远有处安放——任何输入都能映射到Cart的结构业务层可以精确感知哪些话没被理解从而给出针对性反馈见下文main.ts中的处理逻辑。商品与选项的判别式联合Product类型把商品聚合为四种可判别联合export type Product BakeryProducts | LatteDrinks | EspressoDrinks | CoffeeDrinks;每种商品都带有type字段作为判别标记例如export interface LatteDrinks { type: LatteDrinks; name: cappuccino | flat white | latte | latte macchiato | mocha | chai latte; temperature?: CoffeeTemperature; size?: CoffeeSize; // The default is grande options?: (Milks | Sweeteners | Syrups | Toppings | Caffeines | LattePreparations)[]; }值得注意的几个 Schema 设计细节字面量联合即枚举name字段用字符串字面量联合列出全部可售品名cappuccino | flat white | ...LLM 在翻译时被约束只能从中取值从源头杜绝了编造菜单可选字段与默认值注释size?: CoffeeSize并注释// The default is grande。TypeScript 类型本身没有默认值概念但注释会随 Schema 文本一起进入 Prompt引导模型对未提及的尺寸按默认值处理或省略字段选项按商品类别差异化不同饮品开放不同的选项集合——拿铁类LatteDrinks可选牛奶、甜味剂、糖浆、配料、咖啡因与制备方式LattePreparations而浓缩咖啡类EspressoDrinks则用Creamers替代Milks尺寸枚举也从CoffeeSize换成更贴切的EspressoSizesolo | doppio | triple | quad。选项量化OptionQuantity部分选项如甜味剂、糖浆、配料还带有一个量化字段export type OptionQuantity no | light | regular | extra | number;这是一个枚举 数字的混合类型正好覆盖了自然语言的表达空间no foamno、light whipped creamlight、a pack of sugar1以 number 表示、three pumps of vanilla3都能被统一收纳。从 typescript/examples/coffeeShop/src/input.txt 可以看到大量这类表达例如id like a light nutmeg espresso、a flat white with five pumps of caramel syrup。菜单全貌一览Schema 中完整定义了四类商品、九类选项/制备方式与四种枚举汇总如下类别类型名关键字段烘焙BakeryProductsname4 种 muffin / bageloptionsBakeryOptions或BakeryPreparations拿铁类LatteDrinks6 种品名temperature/size选项含Milks、Sweeteners、Syrups、Toppings、Caffeines、LattePreparations浓缩咖啡类EspressoDrinks4 种品名选项含Creamers等咖啡类CoffeeDrinksamericano/coffee糖浆Syrups10 种口味optionQuantity?咖啡因Caffeinesregular/half caf等 5 档牛奶Milks7 种奶奶精Creamers10 种含half and half、heavy cream配料Toppingscinnamon、foam、ice等制备方式LattePreparationsfor here cup、with room、dry、wet等甜味剂Sweetenersequal、sugar、splenda等此外还有四个类型别名CoffeeTemperaturehot | extra hot | warm | iced、CoffeeSizeshort | tall | grande | venti、EspressoSize、OptionQuantity。运行效果从自然语言到 JSONtypescript/examples/coffeeShop/README.md 给出了最直观的运行示例。当输入☕ wed like a cappuccino with a pack of sugar模型输出{ items: [ { type: lineitem, product: { type: LatteDrinks, name: cappuccino, options: [ { type: Sweeteners, name: sugar, optionQuantity: regular } ] }, quantity: 1 } ] }这个输出清晰地展示了三层结构外层是Cart.items本例只含一个LineItem商品层product命中LatteDrinks品名为cappuccino选项层options中sugar被归类为Sweeteners并把a pack of sugar量化为optionQuantity: regular而不是数字1——这体现了模型对一包糖的口语化理解而非机械计数。quantity: 1表明wed like a ...整体对应一件商品。若输入包含多件商品如input.txt中的id like a tall decaf latte iced a grande cappuccino double espresso and a warmed poppyseed muffin sliced in halfitems数组会相应包含多个LineItem。手把手运行 Coffee Shop 示例第一步准备环境Coffee Shop 示例依赖 Node.js 与 npm。按 typescript/examples/README.md 的指引在本仓库的typescript目录下安装依赖cd typescript npm install该 README 同时也介绍了 GitHub Codespaces 的云开发环境方案本地运行只需 Node.js 18.16.0 LTS 或更新版本。第二步构建示例在仓库根目录执行npm run build-all该命令会同时构建 TypeChat 库本体与全部示例。Coffee Shop 示例自身的构建脚本定义在 typescript/examples/coffeeShop/package.json 中scripts: { build: tsc -p src, postbuild: copyfiles -u 1 src/**/*Schema.ts src/**/*.txt dist }注意postbuild会把Schema.ts与input.txt一并复制到dist目录——这是运行时fs.readFileSync读取 Schema 文本所必需的见下文main.ts分析。第三步配置模型凭据示例通过createLanguageModel(process.env)从环境变量选择 OpenAI 或 Azure OpenAI 端点。推荐在typescript目录下创建.env文件# For OpenAI OPENAI_MODEL... OPENAI_API_KEY... # For Azure OpenAI AZURE_OPENAI_ENDPOINT... AZURE_OPENAI_API_KEY...各变量含义如下变量说明OPENAI_MODELOpenAI 模型名如gpt-3.5-turbo或gpt-4OPENAI_API_KEYOpenAI API KeyOPENAI_ENDPOINTOpenAI API 端点可选默认https://api.openai.com/v1/chat/completionsOPENAI_ORGANIZATIONOpenAI 组织 ID可选默认空AZURE_OPENAI_ENDPOINTAzure OpenAI REST API 完整 URL含 deployment 与 api-versionAZURE_OPENAI_API_KEYAzure OpenAI API Key如果端点需要经过代理访问例如受限网络区域还可以在.env中配置HTTPS_PROXYhttp://127.0.0.1:7890 # Optional: comma-separated hosts that should bypass the proxy NO_PROXYlocalhost,127.0.0.1第四步运行进入coffeeShop目录支持两种运行方式交互模式——从终端逐条输入node ./dist/main.js文件模式——逐行处理输入文件示例自带的 input.txt 与 input2.txtnode ./dist/main.js ./dist/input.txt注意示例的main指向dist/main.js文件参数也要用构建后复制到dist中的input.txt路径。交互模式下输入quit或exit结束会话该行为由processRequests实现见下文。input.txt与input2.txt的内容设计也值得玩味前者包含 47 条由易到难的句子覆盖单品、多件、尺寸调整、重复表达、数字泵数、法语/丹麦语un petit cafe、en lille kaffe以及完全无关的句子roses are red、two lawnmowers, a grande latte and a tall tree用于系统性考验 Schema 的边界后者则浓缩了其中最有挑战性的 8 条适合快速回归。代码级剖析main.ts 的完整链路typescript/examples/coffeeShop/src/main.ts 仅约 43 行却串起了 TypeChat 的全流程import { createJsonTranslator, createLanguageModel } from typechat; import { createTypeScriptJsonValidator } from typechat/ts; import { processRequests } from typechat/interactive; import { Cart } from ./coffeeShopSchema; const dotEnvPath findConfig(.env); assert(dotEnvPath, .env file not found!); dotenv.config({ path: dotEnvPath }); const model createLanguageModel(process.env); const schema fs.readFileSync(path.join(__dirname, coffeeShopSchema.ts), utf8); const validator createTypeScriptJsonValidatorCart(schema, Cart); const translator createJsonTranslator(model, validator);1. 环境变量加载findConfig(.env)从当前目录向上逐级查找.env文件找不到时直接assert失败并提示.env file not found!然后由dotenv注入环境变量。2. 把 Schema 源码作为字符串协议加载fs.readFileSync把coffeeShopSchema.ts的源码文本读入内存——这正是 TypeChat 的设计精髓Schema 不是编译期类型而是运行时被原样拼进 Prompt 的共享协议。它同时被用作LLM 翻译时的格式约束进入 PromptTypeScript 编译器校验时的类型来源进入内存编译器。3. 创建校验器与翻译器createTypeScriptJsonValidatorCart(schema, Cart)返回一个TypeChatJsonValidator其中Cart是目标类型名createJsonTranslator(model, validator)把它们组合成翻译器。两者的接口定义在 typescript/src/typechat.ts。4. 请求处理与结果消费processRequests(☕ , process.argv[2], async (request) { const response await translator.translate(request); if (!response.success) { console.log(response.message); return; } const cart response.data; console.log(JSON.stringify(cart, undefined, 2)); if (cart.items.some(item item.type unknown)) { console.log(I didnt understand the following:); for (const item of cart.items) { if (item.type unknown) console.log(item.text); } return; } processOrder(cart); console.log(Success!); });processRequests(☕ , process.argv[2], callback)来自 typescript/src/interactive/interactive.ts当传入第二个命令行参数输入文件路径时逐行读取文件并调用回调否则进入交互循环直到用户输入quit或exit。回调里值得注意的业务逻辑UnknownText不只是 Schema 的兜底也是业务分支的入口——一旦items中出现type unknown程序不会打印Success!而是列出所有未被理解的原文把翻译不确定性显式暴露给用户。这正是 README 强调该类型捕获不匹配现有类型的用户输入的落地应用。Result判别联合success标志 data/message定义在 typescript/src/result.ts是贯穿 TypeChat 所有 API 的返回约定。底层原理TypeChat 如何完成翻译 校验 修复翻译循环与自动修复typescript/src/typechat.ts 中的translate是核心。它首先构造请求 PromptcreateRequestPromptYou are a service that translates user requests into JSON objects of type Cart according to the following TypeScript definitions:{Schema 源码}The following is a user request: {用户输入} The following is the user request translated into a JSON object with 2 spaces of indentation and no properties with the value undefined:然后进入循环取模型回复 → 用首尾{/}截取 JSON 片段 →JSON.parse→ 交给 validator 校验。若校验失败且attemptRepair为true默认值见 typescript/src/typechat.ts则追加一轮修复对话createRepairPromptThe JSON object is invalid for the following reason: {校验器返回的错误信息} The following is a revised JSON object:把首次校验错误回灌给模型重试一次。这是 TypeChat 显著降低 LLM 输出格式错误率的关键机制。translate还暴露了stripNulls开关默认false部分模型如 gpt-3.5-turbo倾向于给可选属性填null开启后会在校验前递归删除 null 值属性typescript/src/typechat.ts。内存中的 TypeScript 编译器校验typescript/src/ts/validate.ts 实现了用 TypeScript 编译器校验 JSON的机制validate把 JSON 对象转换成一段临时模块代码import { Cart } from ./schema; const json: Cart { ... };再用内存中的ts.createProgram组合lib.d.ts一个精简的内置类型声明见 typescript/src/ts/validate.ts、schema.ts即读入的 Schema 源码和json.ts三份虚拟文件进行编译收集语法与语义诊断作为校验错误。这意味着任何 TypeScript 类型层面的违规——拼错品名、漏掉必填字段、选项类型不符——都会被编译器精确捕获。仓库中的 validate.test.ts 等测试文件正是围绕这套校验器展开的。语言模型封装与重试策略createLanguageModeltypescript/src/model.ts根据环境变量自动选择 OpenAIOPENAI_API_KEY或 Azure OpenAIAZURE_OPENAI_API_KEY实现底层complete封装了 fetch 请求、temperature: 0、n: 1参数、瞬时错误429/500/502/503/504重试默认最多 3 次、间隔 1000ms、单请求超时默认 10 分钟与响应体大小上限默认 100MB等健壮性细节typescript/src/model.ts。进阶探索从 Coffee Shop 走向更复杂的 SchemaCoffee Shop 是学习 TypeChat Schema 建模的最佳起点沿着 typescript/examples/README.md 推荐的阅读顺序可以继续深入Restaurant 示例与 Coffee Shop 同属订单翻译范式但 Schema 更复杂用文本prose文件展示简单与高级模型在处理复合句、干扰信息与修正表达时的差异Math 示例把计算题翻译成调用四则运算 API 的程序展示 TypeChat 的程序生成能力是理解program.ts与model.ts关系的进阶案例Drawing 示例把绘画请求翻译成结构化形状box、ellipse、arrow再渲染为 SVGMusic 示例把每个用户意图翻译成一系列 JSON 动作构成一个简单的数据流程序。这些示例共同印证了 Coffee Shop 所体现的方法论先定义好名词世界类型 Schema再让 LLM 在约束内自由发挥——类型即协议校验即防线。小结Coffee Shop 示例用不到 110 行的 Schema 加 43 行的main.ts完整演示了 TypeChat 的核心闭环TypeScript 类型作为 Prompt 协议约束 LLM 输出 → 内存 TypeScript 编译器校验 JSON → 失败时自动回灌错误修复。Cart的联合类型设计、UnknownText的容错兜底、OptionQuantity的枚举 数字量化都是可以迁移到任意垂直领域点单、预约、检索、客服的通用建模范式。对想用类型驱动方式构建自然语言界面的开发者而言这个示例既是入门教材也是可复用的工程模板。赞分享大模型AI 应用后端【免费下载链接】TypeChatTypeChat is a library that makes it easy to build natural language interfaces using types.项目地址https://gitcode.com/gh_mirrors/ty/TypeChat点击查看免费下载相关推荐TypeChat Coffee Shop 实战指南用 Schema 类型把自然语言咖啡点单翻译为结构化 JSONTypeChat Coffee Shop 实战指南用 Schema 类型把自然语言咖啡点单翻译为结构化 JSON 本指南以 TypeChat Python 示大模型AI 应用后端TypeChat 情感分析示例深度解析用 TypeScript 类型把自然语言映射为负/中/正三分类TypeChat 情感分析示例深度解析用 TypeScript 类型把自然语言映射为负/中/正三分类 Sentiment 是 TypeChat 官方 Type大模型AI 应用后端TypeChat 实战用 Zod Schema 构建自然语言情感分类器sentiment-zod 示例全解析TypeChat 实战用 Zod Schema 构建自然语言情感分类器sentiment zod 示例全解析 导读 本篇文章基于 TypeChat 仓库中大模型AI 应用后端上一篇蔚蓝档案鼠标指针主题为Windows桌面注入动漫灵魂的完整指南下一篇Electric 与 Phoenix LiveView 实战把 Postgres 实时同步进 LiveView Stream无需手写查询与变更处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考