langchainjs&langgraphjs入门(二)格式化输出
格式化输出
zod
zod是一个ts的类型校验库,langchain官方推荐使用zod来定义ai输出的schema,例如:
import {z} from 'zod'
// 期望ai返回对象,其中包含name,age,skills
const schema = z.object({
name:z.string().describe('姓名'),
age: z.number().init().describe('年龄'),
skills: z.array(z.string()).describe('技能')
})
安装:
npm i zod
速查表:
| API | 用途 | 示例 |
|---|---|---|
z.string() |
字符串 | z.string() |
z.number() |
数字 | z.number().int() |
z.boolean() |
布尔值 | z.boolean() |
z.object() |
对象 | z.object({ name: z.string() }) |
z.array() |
数组 | z.array(z.string()) |
z.enum() |
枚举 | z.enum(["A", "B"]) |
z.union() |
联合类型 | z.string().or(z.number()) |
z.optional() |
可选字段 | z.string().optional() |
z.nullable() |
允许 null | z.string().nullable() |
z.default() |
默认值 | z.number().default(0) |
z.literal() |
字面量 | z.literal("on") |
z.record() |
键值映射 | z.record(z.string()) |
z.tuple() |
元组 | z.tuple([z.string(), z.number()]) |
.refine() |
自定义校验 | .refine(s => s.length > 3) |
.transform() |
转换输出 | .transform(s => s.toUpperCase()) |
.describe() |
描述 | z.string().describe('姓名') |
withStructuredOutput
上一章节的例子可以看到模型的输出只是普通的字符串,并没有格式化.无法直接使用.要想让模型输出格式化的内容可以使用官方推荐的zod,使用他来定义数据结构并验证数据结构是否正确,从而帮助langchain实现输出的格式化和验证.
- 首先使用
zod定义类型 - 然后通过
langchain提供的.withStructuredOutput接口使用类型,调用这个方法传入zod定义的类型.模型将添加所需的所有模型参数和输出解析器
示例
import model from './1调用模型.mjs'
import { z } from 'zod'
const schema = z.object({ isCool: z.boolean() }) // 定义输出类型
const structuredLlm = model.withStructuredOutput(schema)
const res = await structuredLlm.invoke('我帅不帅')
console.log("res:",res); // res: { isCool: true }输出了结构化的内容,可以看到模型也知道我很帅
实际上withStructuredOutput在背后会根据schema自动生成严格的提示词,并自动解析验证模型输出,然后将结果返回给开发者
withStructuredOutput是langchain封装后的便捷api,如果想深入理解背后做了什么可以查看这里,后面我们也会详细讲解
StringOutputParser
StringOutoutParser可以从LLM回复的消息中直接提取文本内容,使得我们获取的不再是AIMessage对象而是纯文本
用法
实例化的方式进行创建
import { StringOutputParser } from "@langchain/core/output_parsers";
// 创建实例(无需传递任何参数)
const outputParser = new StringOutputParser();
// 使用
const res = await llm.invoke('你好')
const str = outputParser.invoke(res)
// 简便使用
const chain = llm.pipe(outputParser)
const res = chain.invoke('你好')
对于格式化输出,为便于记忆暂时先了解这么多.知道langchain提供了这么个功能,当上述能力不满足实际开发场景时,再去翻阅官方文档即可.
关注我,该专栏会持续更新!