LangChain学习之模型 I/O 与输出解析器 (Output Parsers)(3/8)

模块 3: 模型 I/O 与输出解析器 (Output Parsers)

3.1 模型 I/O 概述

在 LangChain 中,模型 I/O (Input/Output) 指的是如何将输入传递给语言模型,以及如何处理和理解模型的输出。虽然 LLM 和 Chat Models 都能处理文本,但它们的输入和输出格式有所不同。本模块将重点介绍如何有效地管理模型的输出,特别是如何将非结构化的文本输出转换为结构化的数据格式 1。

3.2 输出解析器 (Output Parsers)

大型语言模型通常以自由文本的形式生成响应,这对于许多应用程序来说可能不够理想。输出解析器 (Output Parsers) 的作用就是将 LLM 的原始文本输出转换为更结构化、更易于程序处理的格式,例如 JSON 对象、列表或特定的数据类型。LangChain 提供了多种内置的输出解析器,并且允许自定义 2。

3.2.1 列表输出解析器 (List Output Parser)

当您希望模型生成一个项目列表时,可以使用 CommaSeparatedListOutputParser。它会将模型输出的逗号分隔字符串解析成一个字符串数组。

typescript 复制代码
import { CommaSeparatedListOutputParser } from "@langchain/core/output_parsers";
import { PromptTemplate } from "@langchain/core/prompts";
import { ChatOpenAI } from "@langchain/openai";

const parser = new CommaSeparatedListOutputParser();

const model = new ChatOpenAI({
  model: "deepseek-v4-flash",
  temperature: 0,
  apiKey: process.env.DEEPSEEK_API_KEY,
  configuration: {
    baseURL: "https://api.deepseek.com",
  },
});

const chain = PromptTemplate.fromTemplate(
  "列出 5 种适合夏季的水果。\n{format_instructions}"
).pipe(model).pipe(parser);

const result = await chain.invoke({
  format_instructions: parser.getFormatInstructions(),
});

console.log(result);
// 示例输出: [ \'西瓜\', \'甜瓜\', \'草莓\', \'芒果\', \'葡萄\' ]

3.2.2 JSON 输出解析器 (JSON Output Parser)

当您需要模型生成 JSON 格式的结构化数据时,StructuredOutputParser 是一个非常强大的工具。它允许您定义期望的 JSON 结构,并会生成相应的提示词指令,引导模型输出符合该结构的 JSON。如果模型输出不符合预期,解析器会尝试修复或抛出错误 3。

StructuredOutputParser 通常与 Zod 库结合使用,以定义严格的 JSON Schema。

typescript 复制代码
import { StructuredOutputParser } from "@langchain/core/output_parsers";
import { PromptTemplate } from "@langchain/core/prompts";
import { ChatOpenAI } from "@langchain/openai";
import { z } from "zod";

// 定义期望的 JSON 结构
const parser = StructuredOutputParser.fromZodSchema(
  z.object({
    answer: z.string().describe("对用户问题的回答"),
    source: z.string().optional().describe("回答的来源,如果知道的话"),
  })
);

const model = new ChatOpenAI({
  model: "deepseek-v4-flash",
  temperature: 0,
  apiKey: process.env.DEEPSEEK_API_KEY,
  configuration: {
    baseURL: "https://api.deepseek.com",
  },
});

const chain = PromptTemplate.fromTemplate(
  "回答用户的问题。\n{format_instructions}\n{question}"
).pipe(model).pipe(parser);

const result = await chain.invoke({
  format_instructions: parser.getFormatInstructions(),
  question: "地球的周长是多少?",
});

console.log(result);
/*
示例输出:
{
  answer: \'地球的赤道周长约为 40,075 公里。\',
  source: \'维基百科\'
}
*/

3.2.3 自定义输出解析器

如果内置的解析器不能满足您的需求,您可以实现 BaseOutputParser 接口来创建自定义的输出解析器。这需要您实现 parse 方法,该方法接收模型的原始字符串输出并返回您期望的格式。

typescript 复制代码
import { BaseOutputParser } from "@langchain/core/output_parsers";

class CustomOutputParser extends BaseOutputParser<string[]> {
  lc_namespace = ["my_app", "output_parsers"];

  async parse(text: string): Promise<string[]> {
    // 假设模型输出是每行一个项目
    return text.split("\n").map((item) => item.trim());
  }

  getFormatInstructions(): string {
    return "请以每行一个项目的形式列出结果。";
  }
}

// 使用自定义解析器
const customParser = new CustomOutputParser();
// ... 可以像其他解析器一样将其集成到链中

参考文献

1 LangChain.js Model I/O. (n.d.). Docs by LangChain. Retrieved from https://js.langchain.com/docs/modules/model_io/

2 LangChain.js Output Parsers. (n.d.). Docs by LangChain. Retrieved from https://js.langchain.com/docs/modules/model_io/output_parsers/

3 LangChain.js Structured Output. (n.d.). Docs by LangChain. Retrieved from https://js.langchain.com/docs/modules/model_io/output_parsers/structured

相关推荐
仿生狮子2 小时前
OpenAI 攻下千禧年难题之后,开发者似乎无动于衷
前端·数学·vibecoding
Lvan的前端笔记6 小时前
docker:每个前端项目一个 Nginx 容器还是只有一个Nginx容器
前端·nginx·docker
三天不学习6 小时前
Egg.js 4 突然爆火,原因是否归结于AI 原生落地需求爆发?
前端·javascript·全栈·egg.js
敬往事一杯酒哈7 小时前
海康 AGV 导航读码器学习
学习
xcs194057 小时前
前端 vue 的前端页面debugger 进不去
前端·javascript·vue.js
10年前端老司机7 小时前
你的RAG检索正在“高效地重复废话”:一文彻底搞懂MMR算法
langchain·llm·agent
明月_清风8 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
qq_284274059 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
Csvn9 小时前
框架性能优化
前端
qq_2842740510 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造