书接上文。
一、Output Parsers
输出解析器(Output Parser)负责获取 LLM 的输出并将其转换为更合适的格式。这在应用开发中极其重要。
输出解析器的分类
LangChain有许多不同类型的输出解析器
- StringOutputParser :字符串解析器
- JsonOutputParser :JSON解析器,确保输出符合特定JSON对象格式
- XMLOutputParser :XML解析器,允许以流行的XML格式从LLM获取结果
- CommaSeparatedListOutputParser :CSV解析器,模型的输出以逗号分隔,以列表形式返回输出
- DatetimeOutputParser :日期时间解析器,可用于将 LLM 输出解析为日期时间格式
除了上述常用的输出解析器之外,还有:
- EnumOutputParser :枚举解析器,将LLM的输出,解析为预定义的枚举值
- StructuredOutputParser :将非结构化文本转换为预定义格式的结构化数据(如字典)
- OutputFixingParser :输出修复解析器,用于自动修复格式错误的解析器,比如将返回的不符合预期格式的输出,尝试修正为正确的结构化数据(如 JSON)
- RetryOutputParser :重试解析器,当主解析器(如 JSONOutputParser)因格式错误无法解析LLM 的输出时,通过调用另一个 LLM 自动修正错误,并重新尝试解析
字符串解析器 StringOutputParser
StringOutputParser 简单地将 任何输入 转换为 字符串 。它是一个简单的解析器,从结果中提取content字段。
import { StringOutputParser } from '@langchain/core/output_parsers';
const prompt = ChatPromptTemplate.fromMessages([
['system', '你是数学计算专家'],
['human', '计算:{input}'],
]);
// 3. 初始化字符串解析器
const parser = new StringOutputParser();
// 4. 构建 LCEL 链:模板 → 模型 → 解析器(核心写法)
const chain = prompt.pipe(this.llm).pipe(parser);
// 5. 调用链 → 直接返回 纯字符串!
const result = await chain.invoke({
input: '2+5',
});
console.log(result);
JSON解析器 JsonOutputParser
JsonOutputParser,即JSON输出解析器,是一种用于将大模型的 自由文本输出 转换为 结构化JSON数据 的工具。适合场景:特别适用于需要严格结构化输出的场景,比如 API 调用、数据存储或下游任务处理。
// ====================== 步骤1:初始化 JSON 解析器 ======================
const parser = new JsonOutputParser();
// ====================== 步骤2:创建模板(强制AI输出JSON) ======================
const prompt = ChatPromptTemplate.fromMessages([
[
'system',
`
你是数学专家,严格按照要求返回**纯JSON**,不要额外文字、不要注释。
输出格式要求:{formatInstructions}
`,
],
['human', '计算:{input}'],
]);
// ====================== 步骤3:构建 LCEL 链 ======================
// 模板 → 模型 → JSON解析器
const chain = prompt.pipe(this.llm).pipe(parser);
// ====================== 步骤4:调用(直接返回JSON对象) ======================
const result = await chain.invoke({
input: '2 + 5',
// 自动生成格式说明,传给AI(不用手写JSON规则)
formatInstructions: parser.getFormatInstructions(),
});
console.log(result);
XMLOutputParser
XMLOutputParser 是 LangChain 内置的XML 输出解析器,专门把大模型返回的 XML 格式字符串 → 解析成 JavaScript 普通对象
// ====================== 步骤1:初始化核心对象 ======================
// 1.1 创建 XML 解析器(无任何参数,直接用)
const xmlParser = new XMLOutputParser();
// ====================== 步骤2:创建提示模板 ======================
// 关键:必须强制AI返回【标准XML格式】
const promptTemplate = ChatPromptTemplate.fromMessages([
[
'system',
'你是数学专家,只返回标准XML格式数据,不要任何多余文字、解释、标点',
],
['human', '计算:{input},返回结果包含:result(结果)、type(运算类型)'],
]);
// ====================== 步骤3:格式化提示消息 ======================
// 给模板传入变量,生成模型需要的消息格式
const messages = await promptTemplate.formatMessages({
input: '2 + 5',
});
// ====================== 步骤4:调用AI模型,获取XML字符串 ======================
// 直接调用模型,返回原始消息对象
const aiResponse = await this.llm.invoke(messages);
// 提取AI返回的 XML 字符串
const xmlString = (
typeof aiResponse.content === 'string'
? aiResponse.content
: (aiResponse.content as any)[0]?.text || ''
) as string;
console.log('AI返回的原始XML:', xmlString);
// ====================== 步骤5:使用XMLOutputParser解析XML ======================
// 核心:直接调用 parse() 方法,分步解析(无pipe)
const result = await xmlParser.parse(xmlString);
// ====================== 步骤6:使用解析后的对象 ======================
console.log('解析后的JS对象:', result);
输出结果:
AI返回的原始XML:
<response>
<result>7</result>
<type>加法</type>
</response>
解析后的JS对象: { response: [ { result: '7' }, { type: '加法' } ] }
二、调用本地大模型
模型的下载-安装
访问 ollama.com/search 可以查看 Ollama 支持的模型。使用命令行可以下载并运行模型,例如运行qwen3.5:0.8b模型:
ollama run qwen3.5:0.8b
调用本地私有模型
1.安装包
npm install @langchain/ollama
import { ChatOllama } from '@langchain/ollama';
async chatWithOllama() {
// ====================== 1. 初始化 Ollama 模型(对应 Python) ======================
const ollamaLlm = new ChatOllama({
model: 'qwen3.5:0.8b', // 模型名和你完全一致
});
// ====================== 2. 定义消息数组(对应 Python messages) ======================
const messages = [new HumanMessage('你好,请介绍一下你自己')];
// ====================== 3. 调用模型(对应 invoke) ======================
const chatModelResponse = await ollamaLlm.invoke(messages);
console.log(chatModelResponse.content);
}
输出结果:
你好!我是通义千问系列的最新版本 Qwen3.5,你可以通过以下方式和我交流...