拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

TypeChat Math 示例深度解析:用类型驱动自然语言到可执行程序的生成

TypeChat Math 示例深度解析:用类型驱动自然语言到可执行程序的生成 大模型AI 应用后端【免费下载链接】TypeChatTypeChat is a library that makes it easy to build natural language interfaces using types.项目地址https://gitcode.com/gh_mirrors/ty/TypeChat点击查看免费下载导读Math 示例是 TypeChat Python 版本中展示「程序生成program generation」能力的代表性用例它不再局限于把自然语言翻译成静态 JSON 数据而是把乘法、加法、取负等一句句口语描述翻译成由函数调用组成的数据流程序再交给解释器逐条执行得出最终数值。读完本文你将掌握evaluateJsonProgram的核心用法、MathAPI类型化 API 的定义方式、程序 JSON 的结构约定以及 translator validator evaluator 三层协作的底层运行机制。一、示例定位TypeChat 的程序生成模式在 TypeChat 的 Python 示例体系中大多数例子如 Sentiment、Coffee Shop是把自然语言翻译成数据对象而 Math 示例对应 examples README 中的定位是Translate calculations into simple programs given an API that can perform the 4 basic mathematical operators. This example highlights TypeChats program generation capabilities.也就是说Math 示例的核心价值在于证明只要给模型一份类型化 API 的 TypeScript 声明模型就能把用户意图编排成一系列 API 调用形成一段可执行的小程序。这比单纯输出 JSON 更进一步——输出的 JSON 本身就是程序一组带func/args的步骤可以被本地代码安全地求值。整个示例由四个文件组成职责清晰文件职责schema.py定义可调用的数学 API 类型MathAPIprogram.py定义程序 JSON 的 schema、求值器evaluate_json_program、翻译器与校验器demo.py入口组装模型、翻译器、求值器驱动交互会话input.txt示例提示词集合便于批量/文件方式运行二、环境准备与运行方式Math 示例的运行依赖 TypeChat 的 Python 包与一个 OpenAI / Azure OpenAI 端点。完整的开发环境配置见 examples README核心步骤摘要如下。2.1 安装依赖使用hatch推荐cd TypeChat/python hatch shell python examples/math/demo.py或使用venvpipcd TypeChat/python python -m venv ../.venv source ../.venv/bin/activate # Unix/POSIXWindows 使用 .venv\Scripts\Activate.ps1 pip install .[examples] python examples/math/demo.py安装说明TypeChat 的 Python 包要求Python 3.11核心依赖为pydantic2.5.2、pydantic_core2.16.3、httpx0.27.0、typing_extensions4.10.0见 pyproject.tomlexamples可选依赖额外包含python-dotenv1.0.0用于从.env文件读取模型配置。2.2 配置模型端点.env示例默认通过dotenv读取环境变量见 demo.py 中的env_vals dotenv_values()在项目根目录创建.env# For OpenAI OPENAI_MODEL... OPENAI_API_KEY... # For Azure OpenAI AZURE_OPENAI_ENDPOINT... AZURE_OPENAI_API_KEY...OpenAI 端点的可选变量还包括OPENAI_ENDPOINT默认https://api.openai.com/v1/chat/completions与OPENAI_ORGANIZATION默认空字符串Azure 端点则需完整给出chat/completions形式的 REST URL。底层create_language_modelmodel.py的判定逻辑是存在OPENAI_API_KEY则走 OpenAI否则存在AZURE_OPENAI_API_KEY则走 Azure两者都缺失时抛出异常。该函数返回的HttpxLanguageModel通过httpx.AsyncClient发起流式 POST 请求固定携带temperature0.0、n1并对 429/500/502/503/504 等瞬时错误做最多 3 次自动重试。2.3 启动会话在python/examples/math目录下直接运行python demo.py进入交互模式提示符为输入quit或exit结束也可以传入输入文件批量执行python demo.py input.txt三、类型化 APIMathAPI与python_type_to_typescript_schema程序要知道能调用哪些函数靠的是 schema.py 中定义的MathAPI——一个用TypedDict描述的调用契约class MathAPI(TypedDict): This is API for a simple calculator add: Annotated[Callable[[float, float], float], Doc(Add two numbers)] sub: Annotated[Callable[[float, float], float], Doc(Subtract two numbers)] mul: Annotated[Callable[[float, float], float], Doc(Multiply two numbers)] div: Annotated[Callable[[float, float], float], Doc(Divide two numbers)] neg: Annotated[Callable[[float], float], Doc(Negate a number)] id: Annotated[Callable[[float], float], Doc(Identity function)] unknown: Annotated[Callable[[str], float], Doc(Unknown request)]这套类型设计有三点值得注意每个字段都通过Annotated[..., Doc(...)]附加了一句话说明这些Doc文本最终会进入给 LLM 的 TypeScript 声明作为 JSDoc 注释直接影响模型对函数语义的理解签名中的float参数/返回值类型会在转换成 TypeScript 时体现为number并约束模型生成的参数必须是数值额外预留了id恒等函数与unknown兜底体现了类型即约束的设计模型只能在类型允许的函数集合内编排。demo.py中正是通过math.MathAPI把这份 Python 类型交给翻译器翻译器内部调用python_type_to_typescript_schemats_conversion 导出把 Python 类型反射式转换成 TypeScript 声明文本再拼入请求提示词。从源码看program.py 的TypeChatProgramTranslator.__init___raise_on_schema_errors False被显式传入说明该示例允许类型转换存在告警而继续运行。四、程序的数据结构JsonProgram、Expression与FunctionCall程序不是自由文本而是一个有严格类型定义的 JSON 对象。program.py 中定义了程序 schemaExpression: TypeAlias str | int | float | bool | None | dict[str, Expression] | list[Expression] | FunctionCall | ResultReference JsonProgram TypedDict(JsonProgram, {steps: list[FunctionCall]}) ResultReference TypedDict( ResultReference, {ref: Annotated[int, Doc(Index of the previous expression in the steps array)]} ) FunctionCall TypedDict( FunctionCall, { func: Annotated[str, Doc(Name of the function)], args: NotRequired[Annotated[list[Expression], Doc(Arguments for the function, if any)]], }, )这套结构与 TypeScript 版 TypeChat 的program.ts一脉相承核心约定JsonProgram顶层对象只有一个steps字段是一个FunctionCall列表表达先做什么、后做什么的顺序FunctionCallfunc指定函数名必须来自MathAPI的键args为可选的参数列表NotRequired参数本身可以是任意ExpressionResultReferenceref是前序步骤结果在steps数组中的索引这是实现将上一步结果作为下一步入参这一数据流能力的关键——例如先算mul(2, 3)得到step1再把ref指向它喂给addExpression递归类型允许字面量字符串/数值/布尔/None、字典、数组、函数调用与结果引用任意嵌套因此模型可以构造出任意深度的表达式树。通过python_type_to_typescript_schema(JsonProgram)得到的program_schema_text会被嵌入翻译器生成的请求提示词中作为输出必须符合的格式约束见 program.py 的_create_request_prompt。五、求值器evaluate_json_program的工作方式evaluate_json_programprogram.py是程序生成的另一半——把 JSON 程序真正跑起来。它的签名是async def evaluate_json_program( program: JsonProgram, onCall: Callable[[str, Sequence[JsonValue]], Awaitable[JsonValue]] ) - JsonValue执行语义可以概括为顺序遍历steps递归求值每个表达式并把每步结果压入results列表若某表达式是ref则按索引从results中取前序结果若是func则先递归求值其参数数组再回调onCall执行真正的运算整个程序返回最后一步的结果results[-1]。关键细节字面量bool/int/float/str/None直接返回自身不作处理ref必须是非布尔整数且越界0 index len(results)不满足会抛出ValueErrorargs缺失、为None或非法类型时按[]或报错处理逻辑见evaluate_expression的match分支onCall是注入的真实世界副作用程序本身不直接做运算——这正是 TypeChat 程序生成模式的安全边界模型只产出抽象调用实际执行由开发者提供的回调控制。六、端到端剖析demo.py 的三层协作demo.py把上述部件组装成一个完整流程async def main(): env_vals dotenv_values() model create_language_model(env_vals) validator TypeChatProgramValidator() translator TypeChatProgramTranslator(model, validator, math.MathAPI) async def request_handler(message: str): result await translator.translate(message) if isinstance(result, Failure): print(result.message) else: result result.value print(json.dumps(result, indent2)) math_result await evaluate_json_program(result, apply_operations) print(fMath Result: {math_result}) file_path sys.argv[1] if len(sys.argv) 2 else None await process_requests( , file_path, request_handler)6.1 翻译器TypeChatProgramTranslator继承自TypeChatJsonTranslatortranslator.py其translate方法的工作流是拼出请求提示词 → 调用model.complete→ 从响应中截取首尾花括号之间的 JSON →pydantic_core.from_json解析 → 交给 validator 校验 → 若失败则用_create_repair_prompt携带诊断信息让模型重试_max_repair_attempts 1即最多一次修复。该示例通过覆写_create_request_prompt把program_schema_text与MathAPI的 TypeScript 声明同时嵌入提示词指示模型输出 JSON 程序对象。6.2 校验器TypeChatProgramValidator继承TypeChatValidatorvalidator.py覆写validate_object做程序级校验steps必须存在且为序列否则返回Failure。底层的TypeChatValidator通过pydantic.TypeAdapter以严格模式校验 JSON 字符串program.py的注释特别说明由于 Pydantic 对匿名递归类型如JsonProgram的TypeAdapter构造存在问题当前实现用Any替代py_type把结构校验交给覆写后的validate_object。6.3 运算回调apply_operations程序求值时调用的onCall即apply_operations它打印形如mul(2, 3)的调用日志先断言所有参数均为数值否则抛ValueError再按函数名match分发到真实运算——add/sub/mul/div为二元运算neg/id为一元运算未识别的函数名抛出ValueError(Unexpected function name ...)。6.4 请求循环process_requestsprocess_requestsinteractive.py统一处理两种输入传入文件路径时逐行读取并跳过#开头的注释行否则进入交互模式依赖readline提供编辑与历史直到用户输入quit或exit。七、原文示例从自然语言到可执行程序input.txt中提供了五种覆盖不同难度的提示input.txt1 2 1 2 * 3 2 * 3 4 * 5 2 3 * 4 5 * multiply two by three, then multiply four by five, then sum the results既有普通的中缀算术表达式也有逆波兰式2 3 * 4 5 * 最后一句则是完整的自然语言指令。README 中给出的完整运行示例输入提示符仅为 README 示意实际运行时demo.py使用提示符Input: multiply two by three, then multiply four by five, then sum the resultsOutput:import { API } from ./schema; function program(api: API) { const step1 api.mul(2, 3); const step2 api.mul(4, 5); return api.add(step1, step2); } Running program: mul(2, 3) mul(4, 5) add(6, 20) Result: 26注意import { API } from ./schema与function program(api: API) {...}是 TypeScript 版 Math 示例的输出风格Python 版demo.py的实际输出为「打印翻译得到的 JSON 程序 每步函数调用日志 Math Result: ...」例如对2 * 3 4 * 5会看到类似mul(2, 3)、mul(4, 5)、add(6, 20)的调用轨迹与最终结果26。这正是数据流程序的可观察性优势每一步中间结果都清晰可见。八、从源码看设计要点与扩展方向8.1 程序生成的安全边界对比普通 JSON 翻译程序生成把内容生成与行为执行解耦LLM 只负责产出steps声明真正的数值运算由apply_operations完成。ref索引与参数数值类型检查非 int/float 即抛错构成两道防线防止模型幻觉产生非法程序被意外执行。8.2 提示词的可替换性TypeChatProgramTranslator覆写的_create_request_prompt与_create_repair_prompt展示了 TypeChat 的可定制点若想支持更复杂的 DSL如条件、循环、变量绑定只需扩展Expression类型、调整求值器分支并同步更新提示词模板即可翻译器与校验器的整体骨架无需改动。8.3 测试与回归保障仓库的测试目录tests中test_translator.py等用例对翻译、校验与 schema 转换做了覆盖__snapshots__/test_translator.ambr记录了翻译器输出的快照可作为扩展该示例时验证行为一致性的参考。结语Math 示例虽小却是理解 TypeChat 程序生成模式的最佳切口一个 7 字段的MathAPITypedDict 定义了模型的全部行动空间JsonProgram/Expression/FunctionCall/ResultReference定义了程序的静态结构evaluate_json_program与apply_operations定义了程序的动态语义。三者叠加即可让自然语言稳定地转化为可验证、可执行、可观测的程序——这套类型约束 JSON 程序 注入式执行的组合同样可以被复用到音乐播放动作编排见 multiSchema 与 music 示例中更复杂的多步数据流场景。赞分享大模型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 类型把自然语言映射为负/中/正三分类TypeChat 情感分析示例深度解析用 TypeScript 类型把自然语言映射为负/中/正三分类 Sentiment 是 TypeChat 官方 Type大模型AI 应用后端TypeChat Python 情感分类实战用类型定义驱动自然语言意图识别Sentiment 示例全解析TypeChat Python 情感分类实战用类型定义驱动自然语言意图识别Sentiment 示例全解析 TypeChat 的核心思路是用类型Type大模型AI 应用后端TypeChat数学计算示例让AI生成可执行的数学程序TypeChat数学计算示例让AI生成可执行的数学程序 你还在为AI无法准确解析复杂数学问题而困扰吗当用户输入2乘以3加上4乘以5时传统自然语言处理系大模型AI 应用后端上一篇iou-tracker轻量级、实时对象追踪库的深度解析下一篇BrowserMob Proxy与Selenium完美集成自动化测试中的网络嗅探利器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表