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,你可以通过以下方式和我交流...
相关推荐
小糖学代码2 小时前
LLM系列:2.pytorch入门:5.认识深度学习与 PyTorch
人工智能·pytorch·深度学习
嵌入式小企鹅2 小时前
Kimi K2.6开源对标GPT-5.4、英飞凌AURIX拥抱RISC-V、工信部定调太空算力
人工智能·学习·开源·嵌入式·模型·半导体·昇腾
05大叔2 小时前
语言模型 预训练语言模型BERT - 结构Transformer
人工智能·深度学习·语言模型
小谢小哥2 小时前
49-缓存一致性详解
java·后端·架构
惊鸿一博2 小时前
OpenDriveVLA:基于大型VLA模型的端到端自动驾驶(2025 CVPR)
人工智能·机器学习·自动驾驶
墨染天姬2 小时前
【AI】RMSS:循环状态空间模型
人工智能
辉视广播对讲2 小时前
科技赋能智慧监管:智能监仓内屏,重塑监所管理新生态
人工智能·科技·音视频
小真zzz2 小时前
超越“快照”,深入“解剖”:搜极星专业版如何成为品牌AI心智的“高分辨率核磁共振”
大数据·人工智能·ai·seo·geo
不才小强2 小时前
YOLOv8目标检测实战详解
人工智能·yolo·目标检测