开场白
还记得之前给大家介绍的ChatOpenAI和OpenAI时所使用的代码吧 当时、我使用ChatOpenAI的XXXMessage之时,响应结果不是字符串,而是一个AIMessage (Class) 对象,如图:
现我将代码做点极为简单改造,它就可以输出字符串,其他blablabla...的信息全都不要...
很简单有没有,这下子“干净儿”了 —— 可以仔细看看我改了啥: )
LangChain提供了一系列解析器实现来满足应用在不同功能场景中的需求,包括:
(官网截图)当前一共是十三种内置解析器
接下来,分别介绍几个最常用的输出解析器
List Parser
将逗号分隔的文本解析为列表
程序
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
from langchain.output_parsers import CommaSeparatedListOutputParser
output_parser = CommaSeparatedListOutputParser()
format_instructions = output_parser.get_format_instructions()
chain = ChatOpenAI(temperature=0) | output_parser
response = chain.invoke([HumanMessage(content="你好,请问北京市有哪些行政区域?" + format_instructions)])
print(response)
输出结果
['东城区', '西城区', '朝阳区', '海淀区', '丰台区', '石景山区', '门头沟区', '房山区', '通州区', '顺义区', '昌平区', '大兴区', '怀柔区', '平谷区', '密云区', '延庆区']
Structured Output Parser
当使用类似json数据结构(包含多个字段)可以使用这个解析器,它可以生成指令帮助LLM返回结构化数据文本,同时完成文本到结构化数据的解析工作 当使用Json返回结构,也可以直接使用Json Parser
程序
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
#定义响应的结构为json
response_schemas = [
ResponseSchema(name="Region", description="回答用户问题结果的区域名称"),
ResponseSchema(name="Street", description="回答用户问题结果的街道名称")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas=response_schemas)
format_instructions = output_parser.get_format_instructions()
chain = ChatOpenAI(temperature=0) | output_parser
response = chain.invoke([HumanMessage(content="你好,请问北京市最小的行政区域是哪个?这个行政区域有哪些街道?" + format_instructions)])
print(response)
输出结果
太长了,截个片段吧 (^_^)
Pydantic Parser
允许用户指定任意的 Pydantic 模型,并查询符合该模式的 LLM 输出
程序
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
from typing import List
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.output_parsers import PydanticOutputParser
class District(BaseModel):
Region: str = Field(description="回答用户问题结果的区域名称")
Street: List[str] = Field(description="回答用户问题结果的街道名称,以列表形式展示")
output_parser = PydanticOutputParser(pydantic_object=District)
format_instructions = output_parser.get_format_instructions()
chain = ChatOpenAI(temperature=0) | output_parser
response = chain.invoke([HumanMessage(content="你好,请问台北市最大的行政区域是哪个?这个行政区域有哪些街道?" + format_instructions)])
print(dict(response))
输出结果
{'Region': '大安区', 'Street': ['信义路', '忠孝东路', '敦化南路', '复兴南路', '仁爱路']}