ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

TypeChat 使用指南:用 TypeScript 类型构建类型安全的自然语言接口

TypeChat 使用指南:用 TypeScript 类型构建类型安全的自然语言接口 大模型AI 应用后端【免费下载链接】TypeChatTypeChat is a library that makes it easy to build natural language interfaces using types.项目地址https://gitcode.com/gh_mirrors/ty/TypeChat点击查看免费下载导读TypeChat 是微软开源的一个实验性库核心思想是用类型定义而不是大段提示词工程来约束大语言模型LLM的输出——你只需用 TypeScript 类型描述应用期望的数据结构TypeChat 就会负责构造提示词、让 LLM 返回符合结构的 JSON、用 TypeScript 编译器校验结果并在校验失败时引导模型自我修复。读完本文你将掌握 TypeChat 的两种核心用法数据模式与 API 模式、完整的环境变量与配置参数以及从安装到落地一个情感分析接口的全过程并理解其类型即模式的底层原理。为什么需要 TypeChat从自然语言到结构化数据的难题过去几个月围绕新一代大语言模型的热情集中在一个问题上如何把这些模型真正集成进现有应用的界面聊天助手是最直接的应用但对大多数应用而言更关键的是——如何用 AI 把用户的自然语言请求转换成应用可以操作的数据这正是 TypeChat 要回答的三个问题如何用自然语言界面去增强传统 UI如何把用户请求变成应用能处理的东西如何确保应用是安全的让开发者和用户都能信任 AI 做的工作LLM 默认输出自然语言解析极其困难当前这波 LLM 默认以自然语言交流例如英语。无论你如何在提示词里宠着它——比如加一句请用项目符号列表的形式回答——从原始文本中重建结构对常规软件来说都极其困难。自然语言可能有结构但典型软件很难从文本中把它还原出来。让 LLM 直接输出 JSON可行但不可靠令人意外的是如果我们要求 LLM 以 JSON 形式回答它通常能给出像样的结果。原文档给出了一个咖啡店点单的最佳实践示例User:Translate the following request into JSON.Could I get a blueberry muffin and a grande latte?Respond only in JSON like the following:{ items: [ { name: croissant, quantity: 2 }, { name: latte, quantity: 1, size: tall } ] }ChatBot:{ items: [ { name: blueberry muffin, quantity: 1 }, { name: latte, quantity: 1, size: grande } ] }这很好——但只是最好情况。示例可以帮助引导结构却不能详尽定义 AI 应该返回什么也无法提供任何可校验的依据。提示词工程prompt engineering试图解决这些问题却伴随着陡峭的学习曲线而且提示词越长越脆弱。TypeChat 的答案是把提示词工程替换为模式工程schema engineering。核心思想Just Add Types —— 类型即模式把 TypeScript 类型写进提示词类型恰好能弥补上面的缺陷。团队发现因为 LLM 在训练时见过海量的类型定义类型本身就是引导 AI 如何回答的绝佳指南。由于我们要处理的是 JSONJavaScript Object Notation并且 JSON 与 TypeScript 高度契合TypeChat 选择在提示词中使用 TypeScript 类型。还是那个咖啡店点单的例子这次把示例换成类型User:Translate the following request into JSON.Could I get a blueberry muffin and a grande latte?Respond only in JSON that satisfies theResponsetype:type Response { items: Item[]; }; type Item { name: string; quantity: number; size?: string; notes?: string; }ChatBot:{ items: [ { name: blueberry muffin, quantity: 1 }, { name: latte, quantity: 1, size: grande } ] }TypeScript 已被证明非常适合精确描述 JSON。注意size是可选属性size?: stringLLM 在grande上填了它在blueberry muffin上则合理地省略——类型定义既约束了结构又保留了合理的灵活性。用 TypeScript 编译器完成校验 修复闭环那么问题来了当模型犯错、编造出一个不符合类型的响应时怎么办答案很优雅因为这些类型本身就是合法的 TypeScript 代码可以直接用 TypeScript 编译器来校验响应。更妙的是编译器产生的错误反馈还可以用来引导模型修复自己。把提示 → 响应 → 校验 → 用错误信息构造修复提示 → 再次校验组合起来就能得到一个稳健的流程产出类型安全的响应供应用进一步加工、交由用户确认等。一句话总结这个核心思想types are all you need类型就是一切所需。快速上手安装与情感分析示例从 2023 年 7 月发布以来TypeChat 经历了持续演进。当前仓库中 typescript/package.json 记录的版本为0.1.3Node.js 要求18许可证为 MIT。安装npm install typechat即可把它接到任意语言模型上使用。若想从源码构建可以在仓库的 typescript 目录下执行npm install与npm run build构建脚本为tsc -p src。安装后有几个子模块入口见 typescript/package.json 的exports字段导入路径用途typechat核心 APIcreateLanguageModel、createJsonTranslator、结果类型等typechat/tscreateTypeScriptJsonValidator基于 TypeScript 编译器校验typechat/zodcreateZodJsonValidator把 Zod 模式转成校验器与 TS 源码typechat/interactiveprocessRequests交互式/文件批处理入口第一步定义响应模式情感分析示例的模式定义在 typescript/examples/sentiment/src/sentimentSchema.ts// The following is a schema definition for determining the sentiment of a some user input. export interface SentimentResponse { sentiment: negative | neutral | positive; // The sentiment of the text }一个只有单个字段的接口sentiment只能是三个字符串字面量之一。这段文本既是 TypeScript 类型供应用侧类型检查也会被原样读入并拼进给 LLM 的提示词中。第二步组装模型、校验器与翻译器主程序在 typescript/examples/sentiment/src/main.ts。原文档给出的是其早期形态仓库当前版本拆分得更细但整体脉络一致import assert from assert; import dotenv from dotenv; import findConfig from find-config; import fs from fs; import path from path; import { createJsonTranslator, createLanguageModel } from typechat; import { processRequests } from typechat/interactive; import { createTypeScriptJsonValidator } from typechat/ts; import { SentimentResponse } from ./sentimentSchema; 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, sentimentSchema.ts), utf8); const validator createTypeScriptJsonValidatorSentimentResponse(schema, SentimentResponse); const translator createJsonTranslator(model, validator); // Process requests interactively or from the input file specified on the command line processRequests( , process.argv[2], async (request) { const response await translator.translate(request); if (!response.success) { console.log(response.message); return; } console.log(The sentiment is ${response.data.sentiment}); });这个程序只做四件事创建模型 → 读入模式文本 → 创建校验器 → 创建翻译器然后把用户的每一行输入交给translator.translate(request)。成功后response.data就是类型为SentimentResponse的对象可以直接读response.data.sentiment失败则打印response.message。运行方式交互式直接node ./dist/main.js或把请求逐行写入文件后node ./dist/main.js input.txt批处理process.argv[2]就是输入文件名参数。数据模式工作流从请求到类型安全对象TypeChat 一次翻译请求的完整链路可以在 typescript/src/typechat.ts 的translate函数中看到。下面按环节拆解。语言模型工厂与环境变量createLanguageModel的实现见 typescript/src/model.ts。它会根据环境变量自动决定走 OpenAI 还是 Azure OpenAI存在OPENAI_API_KEY时要求同时提供OPENAI_MODEL否则抛异常可选OPENAI_ENDPOINT默认https://api.openai.com/v1/chat/completions与OPENAI_ORGANIZATION存在AZURE_OPENAI_API_KEY时要求提供AZURE_OPENAI_ENDPOINT格式为https://{your-resource-name}.openai.azure.com/openai/deployments/{your-deployment-name}/chat/completions?api-version{API-version}两个 key 都不存在时直接抛出Missing environment variable异常。实践上应避免把凭据硬编码进源码。开发环境使用.env文件并加入.gitignore配合dotenv加载后再传给createLanguageModel(process.env)这也是官方示例 typescript/examples/sentiment/src/main.ts 的做法。提示词生成与翻译循环createJsonTranslator默认构造的请求提示词见 typescript/src/typechat.ts把类型文本和用户请求拼在一起You are a service that translates user requests into JSON objects of type SentimentResponse according to the following TypeScript definitions:{模式源码}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:translate的完整流程typescript/src/typechat.ts是一个循环用model.complete(prompt)取得模型响应从响应文本中截取第一个{到最后一个}之间的内容JSON.parse成对象若设置了stripNulls递归删除值为null的属性应对 gpt-3.5-turbo 等模型偏爱给可选属性填null的倾向交给validator.validate做模式校验成功后再调用validateInstance做应用层附加校验校验失败时若attemptRepair为true默认把原始响应以assistant角色、校验错误信息以user角色追加进提示词构造修复提示后重试一次修复提示见createRepairPrompt仅修复一轮。翻译器还暴露了几个可调属性typescript/src/typechat.ts属性默认值说明attemptRepairtrue是否在 JSON 校验失败时尝试让模型修复置false可禁用stripNullsfalse是否删除解析后 JSON 中值为null的属性针对不允许null的模式validateInstance恒成功模式校验通过后追加的应用层校验回调如业务规则createRequestPrompt/createRepairPrompt内置实现可整体替换提示词模板校验器的两种实现TypeScript 编译器与 ZodTypeChat 提供两个内置校验器。TypeScriptJsonValidatortypescript/src/ts/validate.ts是把模式文本和模型响应都交给内存中的 TypeScript 编译器做类型检查校验时会把 JSON 对象转换成一段临时模块源码import { SentimentResponse } from ./schema; const json: SentimentResponse {...};见createModuleTextFromJsontypescript/src/ts/validate.ts编译器以strict: true、skipLibCheck: true、noLib: true配置运行并为Array、Object、String等内置类型提供一段精简lib.d.ts先取语法诊断syntactic无语法错误再取语义诊断semantic把所有诊断文本拼成错误消息特别地对 TS 错误 2740缺失必填属性原消息会被截断为 and N more会用类型检查器重建完整的缺失属性列表typescript/src/ts/validate.ts让修复提示更加精确。ZodJsonValidatortypescript/src/zod/validate.ts适合不想写.ts文件的场景用一个名称 → Zod 类型对象的映射构建校验器validate内部调用 Zod 的safeParse并会把每个 issue 的路径与消息拼成错误文本getZodSchemaAsTypeScript则负责把 Zod 模式反向生成为 TypeScript 源码文本供提示词使用。情感分析示例的 Zod 版模式如下site/src/docs/typescript/basic-usage.mdimport { z } from zod; export const SentimentResponse z.object({ sentiment: z.enum([negative, neutral, positive]).describe(The sentiment of the text) }); export const SentimentSchema { SentimentResponse };对应的校验器创建方式import { createZodJsonValidator } from typechat/zod; const validator createZodJsonValidator(SentimentSchema, SentimentResponse);交互式输入与文件输入processRequeststypescript/src/interactive/interactive.ts有两个形态传入输入文件名逐行读取文件对每行调用回调文件模式常用于自动化测试与批量评测例如各示例目录下的input.txt不传文件传undefined在标准输入上给出交互式提示符如 用户输入quit或exit退出。API 模式把意图翻译成可执行的程序除了把意图翻译成数据对象TypeChat 还能把意图翻译成由函数调用组成的简单程序这称为 API 模式program 翻译器实现位于 typescript/src/ts/program.ts。此时模式源码必须导出名为API的类型例如 typescript/examples/math/src/mathSchema.ts 这类把数学问题映射为可调用函数的模式。Program 类型与函数调用程序翻译器内置的Program模式typescript/src/ts/program.ts把程序表达为一系列按序求值的函数调用export type Program { steps: FunctionCall[]; } export type FunctionCall { func: string; args?: Expression[]; }; export type Expression JsonValue | FunctionCall | ResultReference; export type JsonValue string | number | boolean | null | { [x: string]: Expression } | Expression[]; export type ResultReference { ref: number; };func指定函数名args是实参可以是 JSON 值、嵌套函数调用、或ref对前序步骤结果的引用。createProgramTranslator(model, schema)typescript/src/ts/program.ts生成的提示词同时包含上面这段Program定义和你的API定义并要求模型输出满足Program类型的 JSON。安全求值与函数名校验程序翻译器的独特价值在于安全执行。evaluateJsonProgram(program, onCall)typescript/src/ts/program.ts用解释器按序求值每个steps项把每个函数调用交给应用提供的onCall(func, args)回调——函数如何执行、能访问哪些资源完全由宿主应用控制而不是像 JavaScript 的eval那样把任意代码交出去。安全还体现在函数名校验isValidFunctionNametypescript/src/ts/program.tsfunc必须是纯 ASCII 标识符字母、_、$开头后续可含数字且不得是Object.prototype的成员如constructor、__proto__、toString、valueOf、hasOwnProperty防止模型借函数名逃逸出预期的 API 表面。校验时createModuleTextFromProgram会把 JSON 程序转换成一段可类型检查的 TS 模块function program(api: API) { const step1 api.xxx(...); ... return ...; }从而复用同一套编译器校验 错误反馈修复机制。开放与可插拔模型无关的架构TypeChat 是开源的、MIT 许可的且刻意设计为模型无关model-neutral。虽然内置了 OpenAI API 与 Azure OpenAI 服务的便捷集成但这一方法适用于任何 chat-completion 风格的 API——不过当前实现最适合同时在 prose 与代码上训练过的模型如 gpt-4 系列。接入任意模型只需实现一个接口只要能构造出满足TypeChatLanguageModel接口的对象就能接入 TypeChattypescript/src/model.tsexport interface TypeChatLanguageModel { retryMaxAttempts?: number; // 可选最大重试次数默认 3 retryPauseMs?: number; // 可选重试间隔毫秒默认 1000 timeoutMs?: number; // 可选单次 HTTP 请求超时毫秒默认 60000010 分钟 maxResponseBytes?: number; // 可选响应体上限字节默认 104857600100 MB complete(prompt: string | PromptSection[]): PromiseResultstring; }其中只有complete是必选输入提示词字符串或带 role 的PromptSection[]返回Resultstring。ResultT是 TypeChat 的统一结果类型——success为true时携带data否则携带message见 typescript/src/result.ts。内置集成与细节行为OpenAI 兼容createOpenAILanguageModel/createAzureOpenAILanguageModel基于 fetch 封装 REST 端点请求体固定设置temperature: 0追求确定性输出与n: 1Responses API当端点 URL 路径以/responses结尾如https://api.openai.com/v1/responses时自动切换到 OpenAI Responses API 的请求/响应格式也可用options.useResponsesApi强制指定重试策略对 429/500/502/503/504 等瞬时错误自动重试若响应带Retry-After头则按其延迟并封顶在重试预算内代理支持可通过HTTPS_PROXY/HTTP_PROXY/ALL_PROXY/NO_PROXY环境变量或options.proxyUrl走代理此时需要按需安装可选依赖undici防护机制单次请求超时与响应体大小上限默认 10 分钟 / 100 MB均可关闭设为 0 或负数防止慢端点挂起或恶意端点耗尽内存。更多示例与文档资源TypeChat 的两种模式在仓库的 typescript/examples 中都有完整可运行的落地示范原文档建议读者通过示例理解不同用法数据模式把意图翻译成 JSON 对象coffeeShop咖啡店点单即本文开头 JSON 示例的来源、restaurant餐厅点餐视图、sentiment情感分析、healthData健康数据分析API 模式把意图翻译成函数调用程序math把数学问题转成可求值的计算步骤、calendar日程操作、drawing绘图指令进阶组合multiSchema先用分类模式做路由、再分派到多个子模式、music带鉴权的音乐控制。各示例目录下都有input.txt预设请求、main.ts主程序与package.json可直接对照运行。更完整的 API 拆解与逐步讲解参见 site/src/docs/typescript/basic-usage.md模式设计技巧与 FAQ 分别见 site/src/docs/techniques.md 和 site/src/docs/faq.md。小结把提示词工程换成模式工程回顾 TypeChat 的设计闭环用类型描述意图 → 类型既是给 LLM 的提示、又是校验响应的标准 → 校验失败时用编译器诊断驱动模型自修复 → 得到类型安全、可继续加工的数据或程序。这套思路把不确定的自然语言 → 结构化数据这一最棘手的环节收敛为类型工程——开发者添加新意图不过是往判别联合类型里加一个成员而已。在此基础上应用可以进一步做实例校验、向用户确认、安全求值等后续处理从而把 LLM 的能力以可信、可控的方式编织进现有应用。赞分享大模型AI 应用后端【免费下载链接】TypeChatTypeChat is a library that makes it easy to build natural language interfaces using types.项目地址https://gitcode.com/gh_mirrors/ty/TypeChat点击查看免费下载相关推荐TypeChat 实战指南用 TypeScript 类型替代 Prompt 工程构建自然语言接口TypeChat 实战指南用 TypeScript 类型替代 Prompt 工程构建自然语言接口 导读 TypeChat 是一个基于 TypeScript大模型AI 应用后端AionUi 远端 Agents 深度解析OpenClaw 远程网关的配置管理、设备握手与流式对话协议AionUi 远端 Agents 深度解析OpenClaw 远程网关的配置管理、设备握手与流式对话协议 本文基于仓库中「设置 → Agents → 远端 Ag人工智能AI 应用AI Agent交互助手桌面应用移动开发TypeChat用类型构建自然语言界面的革命性框架TypeChat用类型构建自然语言界面的革命性框架 TypeChat是一个革命性的自然语言界面构建框架通过将复杂的自然语言处理问题简化为清晰的类型定义问题大模型AI 应用后端上一篇RTKBase完全指南如何搭建你的个人GNSS基准站实现厘米级定位下一篇终极GPT-Engineer环境配置指南Python 3.10-3.12兼容方案与快速部署教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表