输出解析器的使用

文章目录

    • 输出解析器的使用
    • Pydantic JSON输出解析器
    • 结构化输出解析器

输出解析器的使用

    输出解析器的使用主要依靠提示词模板对象的partial方法注入输出指令的字符
串,主要的实现方式是利用PromptTemplate对象的partial方法或在实例化PromptTemplate对象时传递partial variables参数。这样做可以提高代码的灵活性,使得提示词的占位符变量可以根据需要动态增加或减少。使用这种方式可为提示词模板添加输出指令,指导模型输出。

    具体操作是,首先使用output parser…get_format_instructions()获取预设的输出指令,然后在实例化PromptTemplate类时将format instructions作为partial variables的一部分传入,如此便在原有的提示词模板中追加了format instructions变量,这个变量是输出指令字符串。以下是相关的示例代码:

format instructions= output_parser.get_format instructions (
	prompt PromptTemplate(
	template="List five (subject).\n(format instructions)",
	input variables=["subject"],
	partial variables={"format instructions":format instructions))

    在这段代码中,PromptTemplate的模板字符串template中包含两个占位符变量{subject}和{format_instructions}。在实例化PromptTemplate对象时,除了要传人input variables-=[“subject’”]参数,还要通过partial_variables-={“format_instructions’”:format instructions}参数预先填充{format instructions}变量,这样就成功地为提示词模板添加了输出解析器所提供的输出指令。

    现在通过下面的示例完成输出解析器的两大功能:添加输出指令和解析输出格式,同时展示如何将输出解析器运用到链组件上。首先,采用CommaSeparatedListOutputParser输出解析器:

from langchain.output_parsers import CommaSeparatedListoutputParser
from langchain.prompts import PromptTemplate
from langchain.11ms import OpenAI
output_parser =CommaSeparatedListOutputParser()

    然后,使用output parser…get_format_instructions()方法获取预设的格式化输出指令。这个字符串输出指令会指导模型如何将输出格式化为以逗号分隔的消息列表。接下来,创建一个PromptTemplate提示词模板对象:

format_instructions= output_parser.get_format_instructions()
prompt PromptTemplate(
	template="List five (subject).\n(format_instructions)",
	input_variables=["subject"],
	partial_variables=("format instructions":format instructions)
)

    这个提示词模板中定义了一个字符串模板,其中包含两个占位符变量{subject}和{formatinstructions}。{subject}是希望模型产生的列表主题,例如“ice cream flavors’”,而{format instructions}是从输出解析器中获取的预设的输出指令。这里引入OpenAI的LLM模型包装器。打印format instructions的结果,内容是

“Your response should be a list of comma"
separated values,eg:'foo,bar,baz'"
from langchain.chains import LLMChain
chain =LLMChain(
	llm=OpenAI(
		openai_api_key="填人OpenAI的密钥"
		prompt=prompt))

    将subject的值设为ice cream flavors,然后调用prompt…format(subject=-“ice cream flavors”)方法,返回一个完整的提示词字符串,包含指导模型产生5种冰淇淋口味的指令。导入LLMChain链组件,为OpenAI模型类设置密钥,将PromptTemplate类实例化后的对象传人LLMChain链:output chain (“ice cream flavors”)。

    运行这个链得到的是一个JSON对象,output['text]是模型回答的字符串,然后调用输出解析器的pase0方法将这个字符串解析为一个列表。由于输出解析器是CommaSeparatedListOutputParser,所以它会将模型输出的以逗号分隔的文本解析为列表。output_parser.parse (output[‘text’])。最后得到的结果是一个包含5种冰淇淋口味的列表,代表口味的值用逗号隔开:

['Vanilla',
'Chocolate',
'Strawberry',
'Mint Chocolate Chip',
'Cookies and Cream']

Pydantic JSON输出解析器

    PydanticOutputParser输出解析器可以指定JSON数据格式,并指导LLM输出符合开发者需求的JSON格式数据。可以使用Pydantic来声明数据模式。Pydantic的BaseModel就像一个Python数据类,但它具有实际的类型检查和强制转换功能。下面是最简单的Pydantic JSON输出解析器示例代码,导入OpenAI模型包装器和提示词模板包装器:

from langchain.prompts import (PromptTemplate)
from langchain.11ms import OpenAI

    导人PydanticOutputParser类:

from langchain.output parsers import PydanticOutputParser
from pydantic import BaseModel,Field,validator
from typing import List

    这里使用LLM模型包装器,实现与机器人的对话:

model=OpenAI(openai_api_key="填人你的密钥")

    定义数据结构Joke,实例化PydanticOutputParser输出解析器,将该输出解析器预设的输出指令注入提示词模板:

#定义所需的数据结构
class Joke (BaseModel):
	setup:str Field(description="question to set up a joke")
	punchline:str Field(description="answer to resolve the joke")
	#使用Pydantic轻松添加自定义的验证逻辑
	@validator("setup")
	def question_ends_with question mark(cls,field):
		if field[-1]!="?":
			raise ValueError ("Badly formed question!")
		return field
	#创建一个用于提示LLM生成数据结构的查询
	joke query "Tell me a joke."
	#设置一个输出解析器,并将指令注人提示词模板
	parser PydanticOutputParser(pydantic object=Joke)
	prompt =PromptTemplate
		template="Answer the user query.\n(format_instructions)\n(query}\n",
		input_variables=["query"],
		partial variables=("format instructions":
		parser.get format instructions ())
	)
	_input =prompt.format_prompt (query=joke query)
	output =model(input.to string())
	parser.parse (output)

    将用户输人“ice cream flavors’”绑定到提示词模板的query变量上,使用LLM模型包装器与模型平台进行交互。将该输出解析器预设的输出指令绑定到提示词模板的format instructions变量上:

input =prompt.format (subject="ice cream flavors")
output =model(input)

    调用输出解析器的parse方法,将输出解析为Pydantic JSON格式:output_parser.parse(output)
最终的结果是符合Joke定义的数据格式:

Joke(setup='Why did the chicken cross the road?',punchline='To get to the other side!')

结构化输出解析器

    OutputParsers是一组工具,其主要目标是处理和格式化模型的输出。它包含了多个部分,但对于实际的开发需求来说,其中最关键的部分是结构化输出解析器(StructuredOutputParser)。这个工具可以将模型原本返回的字符串形式的输出,转化为可以在代码中直接使用的数据结构。特别要指出的是,通过定义输出的数据结构,提示词模板中加人了包含这个定义的输出指令,让模型输出符合该定义的数据结构。本质上来说就是通过告诉模型数据结构定义,要求模型给出一个符合该定义的数据,不再仅仅是一句话的回答,而是抽象的数据结构。

    使用结构化输出解析器时,首先需要定义所期望的输出格式。输出解析器将根据这个期望的输出格式来生成模型提示词,从而引导模型产生所需的输出,例如使用StructuredOutputParser来获取多个字段的返回值。尽管Pydantic/JSON解析器更强大,但在早期实验中,选择的数据结构只包含文本字段。首先从LangChain中导入所需的类和方法:

from langchain.output_parsers import StructuredOutputParser,ResponseSchema
from langchain.prompts import PromptTemplate,ChatPromptTemplate,HumanMessagePromptTemplate
from langchain.11ms import OpenAI
from langchain.chat models import ChatopenAI

    然后定义想要接收的响应模式:

response_schemas =[
ResponseSchema(
	name="answer",
	description="answer to the user's question",)
	ResponseSchema(
		name="source",
		description=(
			"source used to answer the user's question,
			"should be a website."))
			]
output parser =StructuredoutputParser.from_response_schemas(response schemas)

    接着获取一个format instructions,包含将响应格式化的输出指令,然后将其插人提示词模板:

format instructions output_parser.get format instructions (
	prompt =PromptTemplate(
		template=(
			"answer the users question as best as possible.\n"
			"(format instructions)\n(question}"
	),
	input_variables=["question"],
	partial variables={
		"format instructions":format instructions}
		)
	model=OpenAI(openai_api_key="填人你的密钥")
	_input prompt.format prompt (question="what's the capital of france?")
	output model(input.to_string ()
	output_parser.parse (output)

    返回结果如下:(‘answer’:‘Paris’,‘source’:·请参考本书代码仓库URL映射表,找到对应资//www.worldatlas.com/articles/what-is-the-capital-of-france.html’)接下来是一个在聊天模型包装器中使用这个方法的示例:

chat_model=ChatOpenAI(openai_api_key="填人你的密钥")
prompt =ChatPromptTemplate
	messages=[
		HumanMessagePromptTemplate.from template(
		"answer the users question as best as possible.\n"
		"(format instructions)\n(question)")
],
input_variables=["question"],
partial_variables={
	"format instructions":format instructions"
	}
	)
input prompt.format prompt(question="what's the capital of france?")
output chat model(input.to messages ()	
output_parser,parse(output.content)#多包一层content

    返回结果如下:(‘answer’:‘Paris’,‘source’:·请参考本书代码仓库URL映射表,找到对应资源://en.wikipedia.org/wiki/Paris’这就是使用PromptTemplate和StructuredOutputParser来格式化和解析模型输人及输出的完整过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964301.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SPI(Serial Peripheral Interface)串行外围设备接口

SPI概述: SPI协议最初由Motorola公司(现为NXP Semiconductors的一部分)在20世纪80年代中期开发。最初是为了在其68000系列微控制器中实现高速、高效的串行通信。该协议旨在简化微控制器与外围设备之间的数据传输。 1980年代:SPI协…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

10分钟快速上手DeepSeek!

DeepSeek 是一款基于命令行和配置文件的数据处理工具,支持多种数据格式(如 CSV、JSON、SQL 等)和多种数据源(如本地文件、数据库、API 等)。 它的核心功能包括: 数据导入与导出:支持从多种数据…

【现代深度学习技术】深度学习计算 | 延后初始化自定义层

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…

Redis --- 秒杀优化方案(阻塞队列+基于Stream流的消息队列)

下面是我们的秒杀流程: 对于正常的秒杀处理,我们需要多次查询数据库,会给数据库造成相当大的压力,这个时候我们需要加入缓存,进而缓解数据库压力。 在上面的图示中,我们可以将一条流水线的任务拆成两条流水…

Rust HashMap :当储物袋遇上物品清单

开场白:哈希映射的魔法本质 在Rust的奇幻世界里,HashMap就像魔法师的储物袋: 键值对存储 → 每个物品都有专属咒语(键)和实体(值)快速查找 → 念咒瞬间召唤物品动态扩容 → 自动伸展的魔法空间…

LabVIEW的智能电源远程监控系统开发

在工业自动化与测试领域,电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作,存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网(IIoT)技术,实现电源设备…

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…

尝试把clang-tidy集成到AWTK项目

前言 项目经过一段时间的耕耘终于进入了团队开发阶段,期间出现了很多问题,其中一个就是开会讨论团队的代码风格规范,目前项目代码风格比较混乱,有的模块是驼峰,有的模块是匈牙利,后面经过讨论,…

Docker技术相关学习三

一、Docker镜像仓库管理 1.docker仓库:用于存储和分发docker镜像的集中式存储库,开发者可以将自己创建的镜像推送到仓库中也可以从仓库中拉取所需要的镜像。 2.docker仓库: 公有仓库(docker hub):任何人都可…

挑战项目 --- 微服务编程测评系统(在线OJ系统)

一、前言 1.为什么要做项目 面试官要问项目,考察你到底是理论派还是实战派? 1.希望从你的项目中看到你的真实能力和对知识的灵活运用。 2.展示你在面对问题和需求时的思考方式及解决问题的能力。 3.面试官会就你项目提出一些问题,或扩展需求…

Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践

title: Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践 date: 2025/2/4 updated: 2025/2/4 author: cmdragon excerpt: PostgreSQL 作为开源关系型数据库的佼佼者,因其强大的功能与性能被广泛应用于各种项目中。而 Python 则因其简洁易用的语法、丰富的库和强大的…

计算机从何而来?计算技术将向何处发展?

计算机的前生:机械计算工具的演进 算盘是计算机的起点,它其实是一台“机械式半自动化运算器”。打算盘的“口诀”其实就是它的编程语言,算盘珠就是它的存储器。 第二阶段是可以做四则运算的加法器、乘法器。1642年,法国数学家帕斯…

【Blazor学习笔记】.NET Blazor学习笔记

我是大标题 我学习Blazor的顺序是基于Blazor University,然后实际内容不完全基于它,因为它的例子还是基于.NET Core 3.1做的,距离现在很遥远了。 截至本文撰写的时间,2025年,最新的.NET是.NET9了都,可能1…

MapReduce分区

目录 1. MapReduce分区1.1 哈希分区1.2 自定义分区 2. 成绩分组2.1 Map2.2 Partition2.3 Reduce 3. 代码和结果3.1 pom.xml中依赖配置3.2 工具类util3.3 GroupScores3.4 结果 参考 本文引用的Apache Hadoop源代码基于Apache许可证 2.0,详情请参阅 Apache许可证2.0。…

重生之我在异世界学编程之C语言:深入指针篇(上)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文(1)内置数…

deep generative model stanford lecture note3 --- latent variable

1 Introduction 自回归模型随着gpt的出现取得很大的成功,还是有很多工程上的问题并不是很适合使用自回归模型: 1)自回归需要的算力太大,满足不了实时性要求:例如在自动驾驶的轨迹预测任务中,如果要用纯自回…

STM32_SD卡的SDIO通信_DMA读写

本篇,将使用CubeMXKeil,创建一个SD卡的DMA读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果,如下图: 一、简述 上篇已简单介绍了SD、SDIO,本篇不再啰嗦,…

互联网行业常用12个数据分析指标和八大模型

本文目录 前言 一、互联网线上业务数据分析的12个指标 1. 用户数据(4个) (1) 存量(DAU/MAU) (2) 新增用户 (3) 健康程度(留存率) (4) 渠道来源 2. 用户行为数据(4个) (1) 次数/频率…

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步

会议官网:www.acvra.org 简介 2025年计算机视觉研究进展与应用(ACVRA 2025)将于2025年2月28-3月2日在中国广州召开,将汇聚世界各地的顶尖学者、研究人员和行业专家,聚焦计算机视觉领域的最新研究动态与应用成就。本次…