news 2026/6/9 23:31:50

别再让 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/6/6 7:48:22

【前端学习AI】大模型调用实战

本地部署&#xff1a;基于Ollama调用开源大模型 Ollama 是轻量级本地大模型运行框架&#xff0c;无需依赖云端服务&#xff0c;可快速部署通义千问、Llama 等开源大模型&#xff0c;特别适合无网络环境或隐私敏感场景。 步骤1&#xff1a;安装Ollama 从官方网站下载并安装&a…

作者头像 李华
网站建设 2026/6/8 3:21:25

LeetCode 3075.幸福值最大化的选择方案:排序

【LetMeFly】3075.幸福值最大化的选择方案&#xff1a;排序 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximize-happiness-of-selected-children/ 给你一个长度为 n 的数组 happiness &#xff0c;以及一个 正整数 k 。 n 个孩子站成一队&#xff0c;其中第 i…

作者头像 李华
网站建设 2026/6/6 7:22:32

Open-AutoGLM 2.0实战指南:从零到部署的完整路径,节省200+开发工时

第一章&#xff1a;Open-AutoGLM 2.0实战指南&#xff1a;从零到部署的完整路径&#xff0c;节省200开发工时 环境准备与依赖安装 在开始使用 Open-AutoGLM 2.0 前&#xff0c;确保系统已安装 Python 3.9 及 pip 包管理工具。推荐使用虚拟环境以隔离项目依赖。 创建虚拟环境&…

作者头像 李华
网站建设 2026/6/9 21:26:01

(独家解读)智谱Open-AutoGLM论文中的7个创新点,99%的人还没注意到

第一章&#xff1a;智谱Open-AutoGLM论文的核心贡献概述智谱AI发布的Open-AutoGLM论文提出了一种面向中文场景自动化的大型语言模型&#xff08;LLM&#xff09;应用框架&#xff0c;旨在降低大模型在实际任务中的使用门槛。该框架通过引入任务感知的提示工程与自动化微调机制&…

作者头像 李华
网站建设 2026/6/9 22:43:13

16、Windows Azure 存储客户端开发与认证详解

Windows Azure 存储客户端开发与认证详解 在使用 Windows Azure 存储服务时,理解如何通过 REST API 进行操作以及如何构建一个简单的存储客户端是非常重要的。下面将详细介绍相关的关键概念和操作步骤。 1. 基本概念 URL :URL 用于标识你想要获取的资源。在 Windows Azur…

作者头像 李华
网站建设 2026/6/9 19:50:38

18、Windows Azure Blob 存储服务全解析

Windows Azure Blob 存储服务全解析 在云计算时代,存储服务是至关重要的基础设施之一。Windows Azure Blob 存储服务提供了强大且灵活的存储解决方案,下面将详细介绍其定价、数据模型、使用注意事项、API 及客户端库的使用,以及容器的相关操作。 1. 定价策略 Windows Azu…

作者头像 李华