nestjs+langchain:Output Parsers+调用本地大模型

书接上文

一、Output Parsers

输出解析器(Output Parser)负责获取 LLM 的输出并将其转换为更合适的格式。这在应用开发中极其重要。

输出解析器的分类

LangChain有许多不同类型的输出解析器

  1. StringOutputParser :字符串解析器
  2. JsonOutputParser :JSON解析器,确保输出符合特定JSON对象格式
  3. XMLOutputParser :XML解析器,允许以流行的XML格式从LLM获取结果
  4. CommaSeparatedListOutputParser :CSV解析器,模型的输出以逗号分隔,以列表形式返回输出
  5. DatetimeOutputParser :日期时间解析器,可用于将 LLM 输出解析为日期时间格式

除了上述常用的输出解析器之外,还有:

  1. EnumOutputParser :枚举解析器,将LLM的输出,解析为预定义的枚举值
  2. StructuredOutputParser :将非结构化文本转换为预定义格式的结构化数据(如字典)
  3. OutputFixingParser :输出修复解析器,用于自动修复格式错误的解析器,比如将返回的不符合预期格式的输出,尝试修正为正确的结构化数据(如 JSON)
  4. RetryOutputParser :重试解析器,当主解析器(如 JSONOutputParser)因格式错误无法解析LLM 的输出时,通过调用另一个 LLM 自动修正错误,并重新尝试解析

字符串解析器 StringOutputParser

StringOutputParser 简单地将 任何输入 转换为 字符串 。它是一个简单的解析器,从结果中提取content字段。

js 复制代码
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 调用、数据存储或下游任务处理。

js 复制代码
// ====================== 步骤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 普通对象

js 复制代码
// ====================== 步骤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);
bash 复制代码
输出结果:
AI返回的原始XML: 
<response>
  <result>7</result>
  <type>加法</type>
</response>
解析后的JS对象: { response: [ { result: '7' }, { type: '加法' } ] }

二、调用本地大模型

模型的下载-安装

访问 ollama.com/search 可以查看 Ollama 支持的模型。使用命令行可以下载并运行模型,例如运行qwen3.5:0.8b模型:

arduino 复制代码
ollama run qwen3.5:0.8b

调用本地私有模型

js 复制代码
1.安装包
npm install @langchain/ollama
js 复制代码
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);
}
erlang 复制代码
输出结果:
你好!我是通义千问系列的最新版本 Qwen3.5,你可以通过以下方式和我交流...
相关推荐
未秃头的程序猿10 小时前
如何用 AI 写出符合规范的 Java 代码?我总结了 7 条有效建议
java·后端·ai编程
零壹AI实验室10 小时前
AI Agent开发实战(一):5分钟搭个能干活的企业级Agent
人工智能
阿聪谈架构10 小时前
第10章:Agent 记忆系统 —— 让 AI 真正"记住"你
人工智能·后端
2zcode10 小时前
基于图像处理与数据分析的智能答题卡识别与阅卷系统设计与实现
图像处理·人工智能·数据分析
木雷坞10 小时前
我把 AI Coding Agent 的 MCP 工具链放进容器里跑了一遍
后端
互联科技报10 小时前
能做表格的 AI 软件:数以轻舟Agent,AI 原生重构表格数据分析全流程
人工智能·重构·数据分析
深圳季连AIgraphX10 小时前
面向量产的自动驾驶高危场景库构建
人工智能·机器学习·自动驾驶
zzzzzz31010 小时前
60ms 启动一个安全沙箱:深入解析腾讯云 CubeSandbox 的架构设计
人工智能
沪漂阿龙10 小时前
面试题:神经网络的训练怎么讲?损失函数、反向传播、梯度下降、Early Stopping、GPU训练、参数量计算一文讲透
人工智能·深度学习·神经网络
Omics Pro11 小时前
柳叶刀|参考文献不存在
人工智能·算法·机器学习·支持向量机·自然语言处理