langchain学习总结-OutputParser组件及使用技巧

OutputParser组件及使用技巧

概述

OutputParser是LangChain中用于解析大语言模型输出结果的组件。它可以将LLM的原始输出转换为结构化的数据格式,如字符串、JSON、列表等,方便后续处理和使用。


StrOutputParser - 字符串输出解析器

功能说明

StrOutputParser 是最简单也是最常用的输出解析器,用于将LLM的输出转换为纯字符串格式。

适用场景

  • 简单的问答场景
  • 文本生成任务
  • 不需要结构化输出的场景

代码示例

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.编排提示模板
prompt = ChatPromptTemplate.from_template("{query}")

# 2.构建大语言模型
llm = ChatOpenAI(model="moonshot-v1-8k")

# 3.创建字符串输出解析器
parser = StrOutputParser()

# 4.调用大语言模型生成结果并解析
content = parser.invoke(llm.invoke(prompt.invoke({"query": "你好,你是?"})))

print(content)

输出

复制代码
你好!我是Kimi,一个由月之暗面科技有限公司(Moonshot AI)开发的人工智能助手。我擅长多语言对话,并且能够提供安全、有帮助、准确的回答。如果你有任何问题或需要帮助,请随时告诉 我,我会尽我所能为你提供支持。

执行流程说明

复制代码
用户输入 → Prompt模板 → LLM处理 → AIMessage → StrOutputParser → 字符串输出

链式调用简化写法

可以将上述流程简化为链式调用:

python 复制代码
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 创建链式调用
chain = ChatPromptTemplate.from_template("{query}") | ChatOpenAI(model="moonshot-v1-8k") | StrOutputParser()

# 直接调用
result = chain.invoke({"query": "你好,你是谁?"})
print(result)

JsonOutputParser - JSON输出解析器

功能说明

JsonOutputParser 用于将LLM的输出解析为JSON格式的结构化数据。它可以配合Pydantic模型定义,强制LLM输出符合特定结构的JSON数据。

适用场景

  • 需要结构化输出的场景
  • 提取特定字段信息
  • 后续需要程序化处理输出的场景

核心组件

Pydantic BaseModel

使用Pydantic的BaseModel来定义JSON结构,通过Field添加字段描述,帮助LLM理解每个字段的含义。

关键方法
  • get_format_instructions(): 获取格式说明,告诉LLM如何输出
  • partial(): 部分填充提示模板

代码示例

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import dotenv
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.创建一个json数据结构,用于告诉大语言模型这个json长什么样子
class Joke(BaseModel):
    # 冷笑话内容
    joke: str = Field(description="回答用户的冷笑话")
    # 冷笑话的笑点
    punchline: str = Field(description="这个冷笑话的笑点")

parser = JsonOutputParser(pydantic_object=Joke)

# 2.构建一个提示模板
# 使用partial预填充format_instructions,包含JSON格式说明
prompt = ChatPromptTemplate.from_template(
    "请根据用户的提问进行回答。\n{format_instructions}\n{query}"
).partial(format_instructions=parser.get_format_instructions())

# 3.构建一个大语言模型
llm = ChatOpenAI(model="moonshot-v1-8k")

# 4.传递提示并进行解析
joke = parser.invoke(llm.invoke(prompt.invoke({"query": "请讲一个关于程序员的冷笑话"})))

print(type(joke))  # <class 'dict'>
print(joke.get("punchline"))  # 获取笑点字段
print(joke)  # 完整的JSON字典

输出示例

python 复制代码
# 输出类似这样的结构:
{
    "joke": "为什么程序员总是混淆圣诞节和万圣节?",
    "punchline": "因为 Oct 31 == Dec 25"
}

工作流程

复制代码
定义BaseModel → 创建JsonOutputParser → 获取格式说明 → 构建Prompt → LLM生成 → 解析为字典

扩展阅读

相关推荐
高频因子挖掘机1 小时前
回测收益为什么可能不真实?从时间戳、数据可用性到未来函数检查
后端·github·api
Java后端的Ai之路9 小时前
06-React-Props
前端·react.js·前端框架
行百里er9 小时前
Redis 完结篇——Redis 热点问题在 Spring Boot 项目中实战
redis·后端
Flynt9 小时前
开源"间谍卫星"说数据全是真的,我把它的免key数据源挨个试了一遍
前端·开源·数据可视化
Csvn10 小时前
渲染管线
前端
程序员大阳10 小时前
副队长CSS教程(33)–圆角与透明
前端·css·透明·圆角
高频因子挖掘机10 小时前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api
志尊宝10 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
鬼手点金11 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
柳杉11 小时前
借助 Codex 和可视化工作流,从调研到完整实现,3D 大屏竟然可以这么简单
前端·ai编程·数据可视化