3-输出解析器outputParsers

输出解析器

  • 通过输出解析器,可以控制响应的结构和格式
  • 没用的情况
使用输出解析器
  • 创建一个 output-parsers.js
js 复制代码
import { StringOutputParser } from "@langchain/core/output_parsers"; // 输出解析器
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { ChatOpenAI } from "@langchain/openai";
import * as dotenv from "dotenv";

// 加载环境变量
dotenv.config();

// 初始化模型
const model = new ChatOpenAI({
  model: process.env.AI_MODEL || "deepseek-chat", // 增加默认值防止未定义
  apiKey: process.env.DEEPSEEK_API_KEY,
  configuration: {
    baseURL: process.env.BASE_URL,
  },
  temperature: 0.7,
  maxTokens: 1024,
  verbose: true,
});

async function run() {
  try {
    // 格式必须是: ["角色类型", "模板内容"]
    // 常用角色: "system" (系统设定), "user" (用户), "human" (同user)
    const prompt = ChatPromptTemplate.fromMessages([
      // 第一条消息:设定系统角色
      ["system", "也是一个幽默的段子手。"],
      // 第二条消息:用户的输入
      ["user", "说一个关于 {input} 的笑话。"],
    ]);

    // 创建输出解析器:将模型输出解析为JSON
    const parser = new StringOutputParser();

    // 创建链:将提示词模板连接到模型 -> **通过pipe(管道)连接到解析器**
    const chain = prompt.pipe(model).pipe(parser);

    // 调用链并等待结果 (必须使用 await)
    const response = await chain.invoke({
      input: "摔跤",
    });
    console.log(response);
  } catch (error) {
    console.error("运行出错:", error);
  }
}

// 执行主函数
run();
  • 另一种输出解释器
js 复制代码
import {
  CommaSeparatedListOutputParser,
  StringOutputParser,
} from "@langchain/core/output_parsers"; // 输出解析器
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { ChatOpenAI } from "@langchain/openai";
import * as dotenv from "dotenv";

// 加载环境变量
dotenv.config();

// 初始化模型
const model = new ChatOpenAI({
  model: process.env.AI_MODEL || "deepseek-chat", // 增加默认值防止未定义
  apiKey: process.env.DEEPSEEK_API_KEY,
  configuration: {
    baseURL: process.env.BASE_URL,
  },
  temperature: 0.7,
  maxTokens: 1024,
  verbose: true,
});

async function callCommaSeparatedListOutputParser() {
  const prompt = ChatPromptTemplate.fromTemplate(`
        你是一个段子手,请根据 {word} 生成一个笑话
    `);
  const outputParser = new CommaSeparatedListOutputParser();
  const chain = prompt.pipe(model).pipe(outputParser);
  return await chain.invoke({ word: "摔跤" });
}

const response = await callCommaSeparatedListOutputParser();
console.log(response);

结构化输出解析器(Structured Output Parser)

  • 根据去提取信息,按照对应的js对象格式输出
js 复制代码
import {
  //   CommaSeparatedListOutputParser,
  StructuredOutputParser,
} from "@langchain/core/output_parsers"; // 输出解析器
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { ChatOpenAI } from "@langchain/openai";
import * as dotenv from "dotenv";

// 加载环境变量
dotenv.config();

// 初始化模型
const model = new ChatOpenAI({
  model: process.env.AI_MODEL || "deepseek-chat", // 增加默认值防止未定义
  apiKey: process.env.DEEPSEEK_API_KEY,
  configuration: {
    baseURL: process.env.BASE_URL,
  },
  temperature: 0.7,
  maxTokens: 1024,
  verbose: true,
});

async function callStructuredOutputParser() {
  const prompt = ChatPromptTemplate.fromTemplate(`
        提取用户给的信息,按照要求的JSON格式输出
        Instructions: {format_instructions}
        用户输入: {phrase}
    `);
  const outputParser = StructuredOutputParser.fromNamesAndDescriptions({
    name: "这个人的名字",
    age: "这个人的年龄",
  });
  const chain = prompt.pipe(model).pipe(outputParser);
  return await chain.invoke({
    phrase: "Max is 30 years old",
    format_instructions: outputParser.getFormatInstructions(),
  });
}

const response = await callStructuredOutputParser();
使用更高级的方式(推荐)
  • 安装:pnpm add zod
js 复制代码
import {
  StructuredOutputParser,
} from "@langchain/core/output_parsers"; // 输出解析器
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { ChatOpenAI } from "@langchain/openai";
import * as dotenv from "dotenv";
import { z } from "zod";

// 加载环境变量
dotenv.config();

// 初始化模型
const model = new ChatOpenAI({
  model: process.env.AI_MODEL || "deepseek-chat", // 增加默认值防止未定义
  apiKey: process.env.DEEPSEEK_API_KEY,
  configuration: {
    baseURL: process.env.BASE_URL,
  },
  temperature: 0.7,
  maxTokens: 1024,
  verbose: true,
});

async function callZodOutputParser() {
  const prompt = ChatPromptTemplate.fromTemplate(`
        提取用户给的信息,按照要求的JSON格式输出
        Instructions: {format_instructions}
        用户输入: {phrase}
    `);

  const outputParser = StructuredOutputParser.fromZodSchema(
    z.object({
      recipe: z.string().describe("食材的名字"),
      ingredient: z.array(z.string()).describe("食材的各种原料"),
    }),
  );

  const chain = prompt.pipe(model).pipe(outputParser);

  return await chain.invoke({
    phrase: "这是西红柿炒蛋,里面有西红柿、蛋、盐、油、葱等",
    format_instructions: outputParser.getFormatInstructions(), //格式化指令
  });
}

const response = await callZodOutputParser();
console.log(response);

后面学习分片查询

相关推荐
Promise微笑5 分钟前
红外分辨率 160×120、320×240、384×288 与 640×480实战选型指南
大数据·运维·人工智能·物联网
米小虾12 分钟前
GPT-5.6一小时破解50年数学猜想!OpenAI公开700词Agent编排密文
人工智能·chatgpt
QN1幻化引擎21 分钟前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
米小虾27 分钟前
中国首个十万卡集群落成!国产算力如何撑起"十万卡时代"
人工智能
长风23043 分钟前
Day14: 极限异常演练 —— 验证系统韧性与错误告警生成
人工智能·安全
吃糖的小孩1 小时前
当 AI Agent 把运行故障问成了文档分析:我如何重做 MainAgent 的分区诊断
人工智能
Lynote AI1 小时前
有什么好用的ai工具推荐?
人工智能
Token炼金师1 小时前
引擎四强:vLLM、SGLang、TensorRT-LLM 与 llama.cpp —— 推理引擎选型对决
人工智能·llm·llama·vllm·tensorrt-llm·sglang
日光明媚1 小时前
LongLive-英伟达-数字人实时生成
人工智能·计算机视觉·aigc·音视频
AI服务老曹1 小时前
GB28181接入AI视频分析常见问题与排查清单:从国标平台注册、通道同步到心跳断线的工程实践
人工智能·音视频