
大模型AI 应用后端【免费下载链接】TypeChatTypeChat is a library that makes it easy to build natural language interfaces using types.项目地址https://gitcode.com/gh_mirrors/ty/TypeChat点击查看免费下载导读本文以 python/examples/sentiment 这个 hello world 级示例为主线逐行拆解 TypeChat Python 库的完整使用链路从接入语言模型OpenAI / Azure OpenAI、定义dataclass或TypedDict模式、创建校验器与 JSON 翻译器到用process_requests构建交互式 REPL 或批量文件处理入口。读完本文你将掌握 TypeChat 六大核心 API 的用法并理解一条用户输入如何最终变成强类型校验通过的 Python 对象。TypeChat 的核心思想是用类型types约束语言模型的输出——把 Python 类型描述给模型让模型按此产出 JSON再经严格校验拿到安全可信的对象。一、整体架构一条用户输入的四段旅程TypeChat 是一个规模很小的库理解它的最好方式就是完整过一遍官方示例。整个调用链可以概括为建模型create_language_model根据环境变量自动识别 OpenAI 或 Azure OpenAI返回一个TypeChatLanguageModel定模式用dataclass/TypedDict描述期望得到的 JSON 结构如Sentiment组翻译器TypeChatJsonTranslator(model, validator, target_type)把三者装配起来循环处理process_requests从交互终端或文本文件逐条读取输入交给translate得到Success[T] | Failure。下面先给出示例 demo.py 的完整代码再逐步剖析import asyncio import sys from dotenv import dotenv_values from typechat import (Failure, TypeChatJsonTranslator, TypeChatValidator, create_language_model, process_requests) import schema as sentiment # 见下方 schema.py 定义 async def main(): env_vals dotenv_values() model create_language_model(env_vals) validator TypeChatValidator(sentiment.Sentiment) translator TypeChatJsonTranslator(model, validator, sentiment.Sentiment) async def request_handler(message: str): result await translator.translate(message) if isinstance(result, Failure): print(result.message) else: result result.value print(fThe sentiment is {result.sentiment}) filename sys.argv[1] if len(sys.argv) 2 else None await process_requests( , filename, request_handler) asyncio.run(main())二、提供模型TypeChat 与任意语言模型的对接协议TypeChat 可以与任何语言模型协同工作前提是该模型满足一个非常简单的协议——一个名为complete的异步方法见 python/src/typechat/_internal/model.pyclass TypeChatLanguageModel(Protocol): async def complete(self, prompt: str | list[PromptSection]) - Result[str]: 表示一个能够完成 prompt 的 AI 语言模型。 TypeChat 使用该协议的一个实现来与 AI 服务通信 该服务根据提供的 schema 将自然语言请求翻译为 JSON 实例。 create_language_model 函数可以创建这样的实例。 ...其中PromptSection是一个TypedDict包含role: Literal[system, user, assistant]与content: str两个字段。TypeChat 生成的首轮 prompt 使用user角色在修复重试repair attempt时会把上一轮模型输出作为assistant消息追加进对话历史。当前 TypeChat 不使用system角色。complete本质上就是一个传入字符串、异步返回包装在Result中的字符串的函数。只要你的模型实现了这一形态就能接入 TypeChat。2.1 开箱即用的两个工厂函数为方便起见TypeChat 直接提供了两个函数对接 OpenAI API 与 Azure OpenAI 服务同样定义在 model.py 中def create_openai_language_model( api_key: str, model: str, endpoint: str https://api.openai.com/v1/chat/completions, org: str ): ... def create_azure_openai_language_model(api_key: str, endpoint: str): ...从源码看model.py两者内部都返回一个HttpxLanguageModel实例基于httpx异步客户端实现OpenAI请求头携带Authorization: Bearer api_key可选OpenAI-Organization默认参数中包含model字段Azure OpenAI请求头同时携带Authorization: Bearer api_key与api-key: api_key以兼容普通 API Key 与托管身份managed identity两种鉴权方式URL 由你传入的完整 endpoint 决定。2.2 自动识别create_language_model更省事的是TypeChat 还提供一个按环境变量自动推断的工厂def create_language_model( vals: dict[str, str | None] ) - TypeChatLanguageModel: ...把环境变量字典传进去即可。判定的优先级逻辑model.py如下检测到的变量结果存在OPENAI_API_KEY构造 OpenAI 模型且要求同时定义OPENAI_MODEL否则抛ValueErrorOPENAI_ENDPOINT缺省为https://api.openai.com/v1/chat/completionsOPENAI_ORG缺省为空串存在AZURE_OPENAI_API_KEY构造 Azure OpenAI 模型且要求同时定义AZURE_OPENAI_ENDPOINT否则抛异常两者皆无抛出ValueError: Missing environment variables for OPENAI_API_KEY or AZURE_OPENAI_API_KEY.结合 python/examples/README.md 中给出的配置表完整的.env文件长这样# For OpenAI OPENAI_MODEL... OPENAI_API_KEY... # For Azure OpenAI AZURE_OPENAI_ENDPOINT... AZURE_OPENAI_API_KEY...其中OPENAI_MODEL可填gpt-3.5-turbo或gpt-4等模型名Azure 的 endpoint 形如https://YOUR_RESOURCE_NAME.openai.azure.com/openai/deployments/YOUR_DEPLOYMENT_NAME/chat/completions?api-version2023-05-15。2.3 可调属性与底层重试机制HttpxLanguageModel暴露了几个可写属性文档标注这些属性尚不稳定可能变化max_retry_attempts最大重试次数默认3retry_pause_seconds重试前等待的秒数默认1.0timeout_seconds单次请求超时秒数默认10max_response_bytes响应体大小上限默认100 MB设为 0 或负数可关闭该限制。底层实现model.py把429、500、502、503、504视为瞬时错误遇到这些状态码且未超过max_retry_attempts时会等待retry_pause_seconds后重试非瞬时错误或重试耗尽则直接返回Failure。每次请求都会强制携带temperature: 0.0与n: 1保证输出尽量确定。另外模型实现同时是异步上下文管理器支持async with并在对象销毁时尝试关闭底层httpx.AsyncClient。2.4 凭据安全永远不要把密钥写进源码无论用哪种方式构造模型都应避免把凭据直接提交进源码。一个兼顾生产与开发环境的做法是在开发环境使用.env文件并在.gitignore中忽略它再用python-dotenv之类的库加载from dotenv import load_dotenv load_dotenv() import os import typechat model typechat.create_language_model(os.environ)示例代码中用的是dotenv_values()只读不注入环境二者都可行load_dotenv会把变量写入os.environ从而可以直接传给create_language_model(os.environ)。三、定义与加载 Schema用 Python 类型约束模型输出TypeChat 通过把类型描述给语言模型来引导其输出格式。做法非常轻量只需定义一个dataclass或TypedDict类描述你期望的响应结构。以 python/examples/sentiment/schema.py 为例示例版本还加了Annotated/Doc注释基础版本如下from dataclasses import dataclass from typing import Literal dataclass class Sentiment: 下面是用于判定某段用户输入情感倾向的 schema 定义。 sentiment: Literal[negative, neutral, positive]这里声明sentiment属性必须是三个字符串之一negative、neutral或positive借助的是typing.Literal提示。3.1 dataclass 与 TypedDict 的选择定义为dataclass你就能享受标准 Python 对象的全部便利例如直接写value.sentiment访问属性定义为TypedDictTypeChat 会返回一个dict访问时需要写成value[sentiment]。两种方式语义等价选择取决于你更喜欢对象还是字典。3.2 类型系统的表达能力值得注意的细节除了标准库typingtyping_extensions同样受支持TypeChat 理解Annotated与Doc这类构造可以为单个属性追加注释这些注释会进入生成的 TypeScript schema 文本帮助模型理解字段含义例如 schema.py 中的写法from dataclasses import dataclass from typing_extensions import Literal, Annotated, Doc dataclass class Sentiment: sentiment: Annotated[Literal[negative, neutral, positive], Doc(The sentiment for the text)]更复杂的类型嵌套结构、联合类型、可选字段、集合、元组、泛型别名等在 python/tests 下有大量快照测试佐证例如test_dataclasses.py、test_generic_alias_1.py、test_tuples_1.py都会把 Python 类型转成对应的.schema.d.ts快照说明 TypeChat 内置了把 Python 类型树转换为 TypeScript schema 文本的完整实现位于 python/src/typechat/_internal/ts_conversion。四、创建校验器生成文本 schema 校验数据形状校验器validator承担两项工作为语言模型生成文本形式的 schema供 prompt 使用确保返回数据符合给定形状。内置校验器的形态如下python/src/typechat/_internal/validator.pyclass TypeChatValidator(Generic[T]): 根据给定的 Python 类型校验对象。 def __init__(self, py_type: type[T]): Args: py_type: 用于校验的 schema 类型。 ... def validate_object(self, obj: object) - Result[T]: 根据关联的 schema 类型校验给定的 Python 对象。 校验成功时返回包含对象的 Success[T] 否则返回带 message 属性描述错误的 Failure。 ...构造校验器只需传入定义好的类型import schema as sentiment validator TypeChatValidator(sentiment.Sentiment)从源码看校验器内部基于Pydantic 的TypeAdapter实现先用pydantic_core.to_json把对象序列化再以strictTrue严格模式反序列化校验。校验失败时_handle_error会为每个错误拼出包含校验路径如Validation path sentiment、出错输入值failed for value ...与具体原因的文本若存在多个错误还会加上 Several possible issues may have occurred... 的前缀说明。这段错误文本随后会被翻译器用作修复 prompt 的输入。五、创建 JSON 翻译器把四要素装配起来TypeChatJsonTranslator把以上概念串成一条流水线。它接收语言模型、校验器、期望类型三样东西对外提供把用户输入翻译成符合 schema 的对象的能力。其内部流程是根据目标类型生成 prompt调用模型获取回复从回复中提取 JSON 数据找到第一个{到最后一个}之间的文本用pydantic_core.from_json解析且不允许inf/nan交给校验器验证若校验失败可选地构造修复 prompt 并重试默认最多 1 次修复尝试见 translator.py 中的_max_repair_attempts 1。translator TypeChatJsonTranslator(model, validator, sentiment.Sentiment)构造时translator.py翻译器会把target_type交给python_type_to_typescript_schema转换为 TypeScript schema 文本并缓存为schema_str若转换出错则抛出带错误明细的ValueError。5.1 一次 translate 的完整调用链当需要翻译用户请求时调用translate方法translator.translate(Hello world! )其内部translator.py生成的请求 prompt 模板大致是You are a service that translates user requests into JSON objects of type Sentiment according to the following TypeScript definitions:{schema_str}The following is a user request: {intent} The following is the user request translated into a JSON object with 2 spaces of indentation and no properties with the value undefined:请求支持可选的prompt_preamble参数用于在生成的 prompt 之前追加额外的字符串或PromptSection列表。如果模型返回的文本中找不到类似 JSON 的内容没有成对的{与}会生成Response did not contain any text resembling JSON.的诊断信息JSON 解析失败则给出Error: ...与尝试解析的原文。这些诊断会连同上一轮的assistant消息一起构成修复 promptThe above JSON object is invalid for the following reason: ...发送给模型重试。重试耗尽仍失败时最终返回Failure。5.2 Result 类型Success 与 FailureTypeChat 统一用可判别联合Result表达成功与失败python/src/typechat/_internal/result.pydataclass class Success(Generic[T]): 表示携带类型 T 结果的成功操作。 value: T dataclass class Failure: 表示因 message 中给出的原因而失败的操作。 message: str Result: TypeAlias Success[T] | Failure通过isinstance(result, Failure)判断失败并打印result.message否则从result.value拿到强类型对象——这正是类型安全落到运行时的关键一环。六、创建 REPLprocess_requests 交互与批处理TypeChat 导出的process_requests函数让实验变得非常简单。它根据第二个参数决定行为传None时创建交互式命令行传文件路径时则逐行读取该文件。签名与实现在 python/src/typechat/_internal/interactive.pyasync def process_requests(interactive_prompt: str, input_file_name: str | None, process_request: Callable[[str], Awaitable[None]]): ...async def request_handler(message: str): ... filename sys.argv[1] if len(sys.argv) 2 else None await process_requests( , filename, request_handler)三个参数的作用分别是prompt 字符串交互场景下用户输入前显示的内容可以设置得俏皮一些官方示例就用了 emoji 文本文件名输入串将逐行从此文件读取。若为None则在sys.stdin.isatty()为真的情况下走标准输入并提供交互提示。通过检查sys.argv脚本在未带命令行参数时保持交互式带参时如python ./example.py inputFile.txt则读取文件请求处理器每条输入都会调用一次该回调。文件模式下还有两个细节点见 interactive.py空行会被过滤掉以#开头的行作为注释被跳过适合在输入文件中书写说明。交互模式下输入quit或exit忽略大小写与首尾空白即可退出会话遇到EOF如 CtrlD也会优雅结束。七、翻译请求处理 Success 与 Failure处理器每次被调用都会收到一条用户输入message字符串把它传给translator即可async def request_handler(message: str): result await translator.translate(message) if isinstance(result, Failure): print(result.message) else: print(fThe sentiment is {result.value.sentiment})模型层发生错误时TypeChat 会按model上配置的max_retry_attempts重试若初始请求与所有重试均失败result就是typechat.Failure可从中读取解释性message理想情况下result是typechat.Success其value属性对应创建翻译器时传入的类型本例即Sentiment可放心访问.sentiment。注意官方文档中的示例打印result.value.sentiment属性访问仓库中 demo.py 的最终版本与之完全一致若 schema 采用TypedDict则应写成result.value[sentiment]。八、完整落地配置环境、安装与运行把上文串起来即可得到可运行的完整项目。官方推荐的开发流程详见 python/examples/README.md如下。8.1 环境准备需要Python 3.11。两种安装方式任选其一# 方式一使用 hatch cd TypeChat/python hatch shell python examples/sentiment/demo.py # 方式二使用 venv pip cd TypeChat/python python -m venv ../.venv source ../.venv/bin/activate # Windows 为 ../.venv/Scripts/Activate.ps1 pip install .[examples] python examples/sentiment/demo.py8.2 配置 .env在项目根目录创建.env文件内容见 2.2 节表格示例运行时会通过dotenv_values()自动读取。8.3 运行# 交互模式输入 quit 或 exit 退出 python examples/sentiment/demo.py # 批处理模式逐行读取输入文件 python examples/sentiment/demo.py input.txt仓库提供了现成的 input.txt内容如hello, world TypeChat is awesome! Im having a good day its very rainy outside运行后每条输入都会被翻译并打印出情感判定。官方说明指出这些示例输入在 GPT 3.5 与 GPT 4 上均能良好运行一般来说同时用代码与自然语言文本训练过的模型准确率较高。九、六步总览与后续延伸到此TypeChat 的基础 API 就已经全部覆盖。回顾整条链路建模型→create_language_model(env_vals)协议TypeChatLanguageModel.complete定模式→dataclass/TypedDict支持Literal、Annotated、Doc、typing_extensions建校验器→TypeChatValidator(Sentiment)基于 PydanticTypeAdapter严格校验组翻译器→TypeChatJsonTranslator(model, validator, Sentiment)自动生成 prompt、解析 JSON、失败自动修复重试循环处理→process_requests( , filename, handler)交互 / 文件批处理双模式处理结果→isinstance(result, Failure)分支处理。官方还提供了更进阶的参考coffeeShop点单意图 → 订单条目列表、calendar日程操作序列、math把算式翻译成四则运算程序展示程序生成能力、healthData带历史的智能体表单填充、multiSchema把请求路由到子应用的 super-app、music把自然语言翻译成数据流式动作序列等。读完本文你已具备从零搭建一个自然语言输入 → 强类型 JSON 输出应用所需的全部核心知识。赞分享大模型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 应用后端上一篇终极图像识别模型对比指南RAM vs RAM vs Tag2Text如何选择最适合你的AI视觉工具下一篇M/o/Vfuscator性能优化案例研究金融交易系统的提速创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考