输出解析器
- 通过输出解析器,可以控制响应的结构和格式
- 没用的情况
使用输出解析器
- 创建一个
output-parsers.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();
- 另一种输出解释器
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对象格式输出
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
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);
后面学习分片查询