news 2026/4/24 17:36:27

别再让 AI 自由发挥了!用 LangChain + Zod 强制它输出合法 JSON

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再让 AI 自由发挥了!用 LangChain + Zod 强制它输出合法 JSON

用 LangChain + Zod 构建类型安全的 AI 结构化输出 —— 从“一句话解释 Promise”开始

大模型很聪明,但也很“自由”。
你让它解释Promise,它可能回你一段优美的散文;
你想要一个干净的 JSON,它却在前后加上“好的!”“希望这对你有帮助!”。

这种“自由发挥”在聊天场景很友好,但在工程实践中却是灾难——我们无法把一段不确定的文本,直接当作结构化数据使用。

你有没有想过,如何让大模型(LLM)不只是“聊天”,而是成为一个可靠的数据生成器

比如:输入"Promise",让它返回一个严格符合以下格式的 JSON:

{ "name": "Promise", "core": "用于处理异步操作的对象", "useCase": ["AJAX 请求", "定时器封装"], "difficulty": "中等" }

这听起来简单,但实际开发中会遇到三大难题:

  1. 模型总爱加解释文字,导致无法直接JSON.parse
  2. 字段名或类型可能出错(比如把useCase写成usecase
  3. TypeScript 拿不到精确类型,只能用any

而解决这些问题的答案,就藏在三行代码里:

const schema = z.object({ ... }); const parser = new JsonOutputParser(schema); const instructions = parser.getFormatInstructions();

本文将带你一步步拆解这段代码背后的原理,理解LangChain + Zod 如何协同工作,实现端到端的类型安全、结构化 AI 输出


🧩 一、Zod:不只是校验,更是“数据契约”

❓ 什么是 Zod?

Zod 是一个TypeScript 优先的运行时校验库。它允许你用代码定义“合法数据长什么样”。

比如:

const FrontendConceptSchema = z.object({ name: z.string().describe('概念名称'), core: z.string().describe('核心要点'), useCase: z.array(z.string()).describe('常见使用场景'), difficulty: z.enum(['简单', '中等', '复杂']).describe('学习难度') });
z.object()到底创建了什么?

不是创建一个普通对象,而是创建了一个Zod Schema(校验规则),这个 schema 具备三重能力:

能力说明
运行时校验通过.parse(data)验证数据是否合法
静态类型推导type T = z.infer<typeof schema>自动获得 TypeScript 类型
元信息描述.describe()可被其他工具(如 LangChain)读取

💡 所以,FrontendConceptSchema本质上是一个“数据契约”—— 它告诉全世界:“只有符合这个结构的数据,才是合法的。”


🔍 二、JsonOutputParser:翻译官 + 质检员

现在问题来了:如何让 LLM 理解这个“契约”?

答案是:JsonOutputParser

const jsonParser = new JsonOutputParser(FrontendConceptSchema);

很多人以为它只是一个“JSON 解析器”,其实它的角色更丰富:

👨‍🏫 角色一:翻译官(指导模型怎么写)

它调用.getFormatInstructions(),把 Zod Schema自动翻译成一段自然语言指令

{ "name": string // 概念名称 "core": string // 核心要点 "useCase": string[] // 常见使用场景 "difficulty": "简单" | "中等" | "复杂" // 学习难度 } */

这段文本会被插入到提示词中,明确告诉模型:“你必须按这个格式输出,不能多、不能少、不能错。”

🌟 这就是为什么你需要显式传入format_instructions: jsonParser.getFormatInstructions()——
LangChain 不会自动填充它,这是你主动连接“schema”和“提示词”的桥梁。


👮 角色二:质检员(检查模型有没有写对)

当模型返回文本后,JsonOutputParser会:

  1. 尝试提取 JSON(如匹配json{...}
  2. FrontendConceptSchema.parse(...)进行 Zod 校验
  3. 如果字段缺失、类型错误、枚举值非法 → 抛出ZodError
  4. 只有完全合规的数据才会返回

✅ 这相当于双重保险:

  • 前验:用提示词引导模型输出合规格式
  • 后验:用 Zod 校验兜底,防止“幻觉”污染业务逻辑

⚙️ 三、完整流程:从提示词到类型安全对象

让我们把所有零件组装起来:

// 1. 初始化模型 const model = new ChatDeepSeek({ model: 'deepseek-reasoner', temperature: 0, }); // 2. 构建强约束提示词 const prompt = PromptTemplate.fromTemplate(` 你是一个只会输出 JSON 的 API,不允许输出任何解释性文字。 ⚠️ 你必须【只返回】符合以下 Schema 的 JSON: {format_instructions} 前端概念:{topic} `); // 3. 创建解析链 const chain = prompt.pipe(model).pipe(jsonParser); // 4. 调用 const response = await chain.invoke({ topic: 'Promise', format_instructions: jsonParser.getFormatInstructions(), }); console.log(response); // { // name: 'Promise', // core: '...', // useCase: [...], // difficulty: '中等' // }

此时,response的类型已被 TypeScript 精确推导为:

{ name: string; core: string; useCase: string[]; difficulty: "简单" | "中等" | "复杂"; }

无需手写 interface,类型与校验逻辑完全同步!


🧱 四、这一切,都建立在 JavaScript 模块化之上

你可能没注意到,但这段代码本身就是现代 JS 模块化思想的典范

import { ChatDeepSeek } from '@langchain/deepseek'; // 模型模块 import { PromptTemplate } from '@langchain/core/prompts'; // 提示词模块 import { JsonOutputParser } from '@langchain/core/output_parsers'; // 解析模块 import { z } from 'zod'; // 校验模块 import 'dotenv/config'; // 配置模块

每个import都代表一个独立、可复用、职责单一的功能单元。这种设计使得:

  • 依赖清晰,无全局污染
  • 功能解耦,易于测试和替换(比如换ChatOpenAI只需改一行)
  • 支持 tree-shaking,打包体积更小

💡没有 ES Modules,就没有现代 AI 应用的工程化。


✅ 五、为什么这套方案值得在生产环境使用?

优势说明
类型安全编译时 + 运行时双重保障,告别any
抗幻觉强提示 + Zod 校验,大幅降低无效输出
可维护修改 schema,提示词和校验自动同步
可扩展易于拆分为schemas/chains/services/等模块
国产友好DeepSeek 等国产模型完美支持

🚀 结语:让 AI 成为可靠的“数据工人”

过去,我们把 LLM 当作“聪明的聊天机器人”;
现在,借助 LangChain + Zod,我们可以把它变成遵守契约的数据生成器

而这背后的核心思想是:

用代码定义结构(Zod),用提示词引导行为(LangChain),用校验确保结果(JsonOutputParser)。

这不仅是技术组合,更是一种AI 工程化思维——
不信任黑盒输出,用契约和验证构建可靠系统。

下次当你需要从 AI 中提取结构化数据时,不妨试试这套模式。你会发现,AI 不仅能“说人话”,还能“写对数据”。

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!​

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示

​因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

四、AI大模型商业化落地方案

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 3:11:46

24、云存储队列与表服务操作全解析

云存储队列与表服务操作全解析 在云存储的应用场景中,队列和表服务是非常重要的组成部分。下面将详细介绍队列消息的操作以及 Windows Azure 表服务的相关内容。 队列消息操作 消息入队 向队列中添加消息时,通过发送如下的 HTTP POST 请求: POST /testq1/messages?ti…

作者头像 李华
网站建设 2026/4/23 12:54:05

31、逐跳行为(PHB)及其实现示例

逐跳行为(PHB)及其实现示例 在网络通信中,为了实现不同类型流量的差异化服务,逐跳行为(Per-Hop Behavior,PHB)的概念应运而生。PHB 描述了差分服务(Diffserv)节点对特定差分服务行为聚合体的外部可观察转发行为。下面将详细介绍 PHB 的相关内容。 1. PHB 基础概念与…

作者头像 李华
网站建设 2026/4/24 14:05:32

互联网大厂求职:Java面试中的技术点和业务场景解析

互联网大厂求职&#xff1a;Java面试中的技术点和业务场景解析 场景描述&#xff1a; 在某互联网大厂的面试室内&#xff0c;面试官正襟危坐&#xff0c;而一旁坐着的程序员谢飞机则显得有些紧张。这是谢飞机的第N次面试&#xff0c;前几次的“辉煌战绩”让他今天不敢掉以轻心。…

作者头像 李华
网站建设 2026/4/23 6:46:28

智谱Open-AutoGLM究竟有多强?:3大核心技术解密国产AutoML新范式

第一章&#xff1a;智谱 Open-AutoGLM沉思在大模型与自动化机器学习交汇的前沿&#xff0c;智谱推出的 Open-AutoGLM 引发了广泛的技术关注。它并非传统意义上的 AutoML 工具&#xff0c;而是尝试将自然语言理解能力与自动化建模流程深度融合&#xff0c;实现以“对话”驱动机器…

作者头像 李华
网站建设 2026/4/23 16:04:51

(AutoGLM 2.0 vs 传统建模):性能对比实测,结果令人震惊

第一章&#xff1a;AutoGLM 2.0 vs 传统建模&#xff1a;性能对比实测&#xff0c;结果令人震惊在真实业务场景中对 AutoGLM 2.0 与传统机器学习建模流程进行端到端对比测试&#xff0c;结果显示其效率与精度均实现跨越式提升。本次测试基于金融风控数据集&#xff0c;涵盖特征…

作者头像 李华
网站建设 2026/4/23 18:18:21

29、Git Hooks与项目组合策略详解

Git Hooks与项目组合策略详解 1. 引言 在使用Git进行版本控制的过程中,我们经常会有各种特定的需求,比如在执行某些操作前后自动执行特定任务,或者处理项目中依赖的外部库。Git提供了钩子(Hooks)机制来满足前者的需求,同时对于项目组合,也有多种策略可供选择。 2. Gi…

作者头像 李华