ARTICLE DETAIL

资讯详情

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

TypeChat 入门:用 TypeScript 类型为 LLM 搭建自然语言接口

TypeChat 入门:用 TypeScript 类型为 LLM 搭建自然语言接口 大模型AI 应用后端【免费下载链接】TypeChatTypeChat is a library that makes it easy to build natural language interfaces using types.项目地址https://gitcode.com/gh_mirrors/ty/TypeChat点击查看免费下载本文面向希望把大语言模型LLM集成进应用、又不想被自由文本响应折磨的开发者以 site/src/docs/introduction.md 为核心脉络完整讲解 TypeChat 的核心思想——只用类型schema加一句自然语言请求就能让 LLM 返回可被程序直接消费的、经过强类型校验的 JSON 数据。读完本文你将掌握 TypeChat 的三步处理流水线构造 Prompt、校验与修复、非 LLM 摘要确认了解其 TypeScript 与 Python 两套实现的核心 API并能复刻一个可交互运行的情感分析sentiment示例。从会聊天到能干活LLM 响应缺乏结构的问题大语言模型能够对请求给出令人惊喜的丰富回答。比如在西雅图一个下雨的周末你可以直接问模型要 3 条周末活动建议它会给出像样的自然语言回答。这类模型本身是非常出色的聊天助手但它们能否被用来为应用增加自然语言接口很多人的经验是能——但算半个结果好坏完全取决于我们如何向模型提问。问题的根源在于模型默认以自然语言如英语作答而传统程序恰恰不擅长处理自然语言。大多数软件期望的是建立在字节、字符、JSON 数据块之上的结构而不是英文句子。没有结构我们就必须自己从文本里解析感兴趣的部分而这种解析往往并不实用。逐步添加结构列表、JSON 到类型为了让输出易于解析一个自然的思路是让模型以更结构化的形式回答文档中演示了三种递进的方案方案一项目符号列表。让模型以项目符号列表的形式给出 3 条建议。结果虽然整齐但如何拆分数据仍是难题——去掉行首的-再按: 切分地点与描述如果某个地点名称本身就含: 呢你会发现解析自然语言的老问题依然存在。方案二直接要求 JSON。好在许多语言模型非常擅长生成 JSON。给模型一个 JSON 模板作为示例[ { venue: ..., description: ... }, { venue: ..., description: ... } ]模型就会乖乖返回合法的 JSON 数组。示例响应example response确实有效但 TypeChat 团队好奇是否还有另一条路——能否直接用 TypeScript 类型来引导模型方案三用类型引导TypeChat 的路线。把类型定义直接写进 Prompt要求模型返回与类型兼容的 JSONinterface Response { data: Array{ venue: string, description: string }; }模型给出的结果与类型完全对齐效果相当好。这个思路在概念上极其简单却是打通自然语言与应用可处理数据之间鸿沟的强大手段。TypeChat 要做的就是把这种模式变得开箱即用并打磨掉语言模型响应的种种毛刺。TypeChat 核心思想类型即一切TypeChat 的核心思想是只要给模型一份 schema若干类型和一个请求就能把自然语言集成进应用并通过强类型的结构化数据来工作。如 typescript/src/typechat.ts 中createJsonTranslator的注释所述它是一个能把自然语言请求翻译成指定类型 JSON 对象的对象。具体地说TypeChat 帮你处理三件事用类型构造发给 LLM 的 Prompt——把 schema 的文本、目标类型名与用户请求拼装成标准化的指令校验 LLM 响应是否符合 schema——若校验失败则通过进一步的模型交互repair prompt修复不合规的输出不用 LLM 也能简洁地概括摘要实例确认其与用户意图一致——在 TypeScript 实现中体现为可扩展的validateInstance钩子默认直接返回Success应用可覆写以追加业务级校验见 typescript/src/typechat.ts。一句话总结Types are all you need!支持的类型策略为自然语言应用定义意图类型非常灵活简单场景一个用于情感分类的接口就足够了如interface SentimentResponse { sentiment: negative | neutral | positive }。复杂场景购物车、音乐应用等更复杂的类型。要往 schema 里增加新意图开发者可以通过类型组合实现比如把多个类型并入一个可辨识联合discriminated union。层级化 schema开发者可以使用一种元 schemameta-schema根据用户输入选择一个或多个子 schema。仓库中的 typescript/examples/multiSchema/src/router.ts 正是这一模式的完整落地createAgentRouter用一个TaskClassificationResponse分类器把请求路由给已注册的 agent未匹配的请求则交给handlerUnknownTask兜底。深入源码TypeChat 的三步流水线文档宣称TypeChat 负责其余一切这三步的具体实现都可以在仓库源码中找到值得逐一拆解。第一步构造 PromptcreateRequestPrompt在 typescript/src/typechat.ts 中createRequestPrompt将请求与 schema 文本、目标类型名拼接成一段标准指令核心模板为You are a service that translates user requests into JSON objects of type SentimentResponse 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:注意模板里显式要求2 空格缩进、无值为undefined的属性这是为了让 LLM 的输出更利于后续 JSON 解析。Python 实现python/src/typechat/_internal/translator.py采用同样的措辞只是把引号换成。第二步解析、校验与修复translate主循环真正的核心是 typescript/src/typechat.ts 中translate函数的循环逻辑调用model.complete(prompt)获取响应在响应文本中定位第一个{到最后一个}之间的子串作为候选 JSON这一步能容忍模型在 JSON 前后附加的废话JSON.parse解析若失败则直接返回错误若启用了stripNulls递归删除值为null的属性一些模型如 gpt-3.5-turbo 倾向于给可选属性赋null而非省略见 typescript/src/typechat.ts用 validator 校验对象校验通过后还会调用validateInstance默认直接成功若校验失败且attemptRepair为 true把上一轮响应以assistant角色、把修复指令以user角色追加进 prompt然后进入下一轮循环修复 promptcreateRepairPrompt把验证器的错误消息喂回模型The JSON object is invalid for the following reason: {validationError} The following is a revised JSON object:translate还会接受可选的promptPreamble字符串或 PromptSection 数组在构造请求 Prompt 之前插入多 schema 路由正是靠它把分类表格作为上下文先行注入。翻译结果统一封装为ResultT{ success: true, data }或{ success: false, message }见 typescript/src/result.ts失败时通过message携带可读的错误说明。校验的底层内存中的 TypeScript 编译器校验器负责两件事给模型生成 schema 文本getSchemaText与检查数据是否符合形状validate。TypeChat 内置的TypeScriptJsonValidator见 typescript/src/ts/validate.ts做法非常巧妙把 JSON 对象序列化为一段 TypeScript 模块源码import { SentimentResponse } from ./schema; const json: SentimentResponse {...};在一个内存中的 TypeScript 编译器实例里用strict: true的编译选项对这个模块做类型检查涉及lib.d.ts、schema.ts、json.ts三个虚拟文件有语法/语义诊断即返回错误消息无诊断则返回类型安全的 JSON 对象。实现还对 TS 错误 2740缺失必填属性且被截断为 and N more做了专门增强用类型检查器重建完整的缺失属性列表让修复 prompt 拿到更精确的报错信息。这正是类型即契约思想的极致体现——schema 既是给模型看的说明又是程序侧的真校验器。语言模型抽象与连接器模型侧由TypeChatLanguageModel接口抽象typescript/src/model.ts核心只有一个必选方法complete(prompt)可选属性包括retryMaxAttempts默认 3 次重试、retryPauseMs默认 1000ms 重试间隔、timeoutMs默认 600000ms即 10 分钟与maxResponseBytes默认 100MB 响应体上限。只要实现了complete任何模型本地模型、第三方服务等都能接入 TypeChat。官方连接器有三层便利函数createOpenAILanguageModel(apiKey, model, endPoint?, org?)——连接 OpenAI Chat Completions API端点默认https://api.openai.com/v1/chat/completions当端点路径以/responses结尾或显式设置useResponsesApi时自动切换 OpenAI Responses APIcreateAzureOpenAILanguageModel(apiKey, endPoint)——连接 Azure OpenAI端点格式如https://{资源名}.openai.azure.com/openai/deployments/{部署名}/chat/completions?api-version{版本}createLanguageModel(env)——根据环境变量自动推断存在OPENAI_API_KEY走 OpenAI还需要OPENAI_MODEL可选OPENAI_ENDPOINT、OPENAI_ORGANIZATION存在AZURE_OPENAI_API_KEY走 Azure还需要AZURE_OPENAI_ENDPOINT两者皆无则抛出异常见 typescript/src/model.ts。此外LanguageModelOptions还支持proxyUrl代理配置通过createLanguageModel时还会自动读取HTTPS_PROXY/HTTP_PROXY/ALL_PROXY/NO_PROXY标准环境变量需要可选依赖undici。注意请求会固定使用temperature: 0以最大限度保证输出的确定性。实操跑通一个完整的情感分析示例文档建议从一个小示例入手理解全貌仓库里最贴合的就是 typescript/examples/sentiment。下面按 TypeScript 版逐步拆解Python 版对应 site/src/docs/python/basic-usage.mdAPI 形态一一对应。1. 定义 schemaschema 文件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是三个字面量字符串的联合模型只能从三者中选一。Python 版则用dataclasstyping.Literal表达同样的约束也支持TypedDict用Annotated/Doc给字段加注释。2. 创建模型与校验器完整入口见 typescript/examples/sentiment/src/main.tsconst model createLanguageModel(process.env); const schema fs.readFileSync(path.join(__dirname, sentimentSchema.ts), utf8); const validator createTypeScriptJsonValidatorSentimentResponse(schema, SentimentResponse); const translator createJsonTranslator(model, validator);注意schema 文件既要用作 TypeScript 类型import又要作为文本原样读入传给模型fs.readFileSync因此它在构建时会被当作本地资产处理。文档给出的应对方式包括用ts-node同时处理类型导入与文件读取用copyfiles把 schema 文件拷贝到输出目录或借助打包器的 raw-string 导入能力。若采用 ECMAScript Modules可用import.meta.url/import.meta.dirname定位文件。如果你更喜欢用 Zod 定义 schema可以改用createZodJsonValidator(schemaObj, typeName)传入的是一个类型名 → Zod 对象的映射如{ SentimentResponse }详见 site/src/docs/typescript/basic-usage.md 与 typescript/examples/sentiment-zod 示例。3. 处理请求交互式 REPL 与文件输入processRequests来自typechat/interactive实现见 typescript/src/interactive/interactive.ts让实验变得极其简单它接受三个参数交互提示符交互模式下显示在用户输入前的字符串可以用 emoji 点缀如 输入文件名传入文件名时按行读取该文件node ./dist/main.js inputFile.txt传undefined时进入标准输入交互模式输入quit或exit退出请求处理器对每条输入回调典型实现为const response await translator.translate(request); if (!response.success) { console.log(response.message); return; } console.log(The sentiment is ${response.data.sentiment});translate返回ResultSentimentResponse成功时response.data是类型完整的对象data.sentiment直接可用失败时response.message给出可读的原因。若初次请求与全部重试都失败success即为false。Python 版对应process_requests与Result/Failure/SuccessPython 用result.value取数据。常见模式与进阶方向掌握了三步流水线与基础 API 后可以继续在仓库里探索这些与文档一脉相承的模式意图组合把多个意图类型并入 discriminated union让一个 translator 覆盖多种用户意图元 schema / 路由multiSchema 示例 展示先用分类 schema 判断任务归属再委派给对应 agent 的分层设计多模态与多 schemaPromptSection支持rolesystem/user/assistant与多模态内容文本 图片见 typescript/src/model.ts为视觉类自然语言接口留好了扩展位其他语言实现Python 版 TypeChatpython/src/typechat实现了同等的模型抽象、类型到 TypeScript schema 的自动转换python_type_to_typescript_schema与TypeChatJsonTranslator修复循环其转化结果可对照 python/tests 下的.schema.d.ts快照文件查看。小结TypeChat 用一条极简的原则——用类型作为自然语言与应用之间的契约——把 LLM 集成进应用的复杂度大幅降低开发者只需定义类型schemaTypeChat 负责构造 Prompt、校验输出、失败修复与结果确认。它既不是魔法也不是黑盒三步流水线的每一环都能在仓库源码中找到精确实现。想快速上手直接运行 typescript/examples/sentiment 或阅读 site/src/docs/typescript/basic-usage.md 的分步拆解即可开始为你的应用搭建第一个自然语言接口。赞分享大模型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 应用后端上一篇MobileNetV4 小型卷积模型与其他模型对比性能、参数和适用场景分析下一篇Wire终极指南Go依赖注入的完整解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表