AI菜鸟向前飞 — LangChain系列之五(输出解析器)

574 阅读2分钟

开场白

    还记得之前给大家介绍的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': ['信义路', '忠孝东路', '敦化南路', '复兴南路', '仁爱路']}