第4节:解析器

目前我们通过langchain输出的结果都是大模型直接返回的结果,但在很多应用中,我们并不是想直接问大模型问题,而是希望大模型输出一些结构化的数据,如 JSON、列表、自定义对象等。

解析器 (Output Parsers) 的作用就是将输出结果转化为我们期望的格式。

1. 解析为字符串

在之前的代码,我们使用response.content来获取大模型的返回。

prompt = "你是谁"
response = llm.invoke(prompt);
print(response.content)

为了更方便地获取返回字符串,我们可以用一个解析器将返回的response直接编程字符串。

from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate([
    ("system", "你是一个擅长心理学的学习助手,帮我用心理学的理论知识解决我学习过程中的困惑"),
    ("user", "{input}")
])

chain = prompt | llm | StrOutputParser();
response = chain.invoke({"input": "我为什么学习不好"})
print(response)

流式输出内容

from langchain_openai import ChatOpenAI

from dotenv import load_dotenv
import os
import asyncio
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

load_dotenv()
llm = ChatOpenAI(
    model=os.getenv("DEEPSEEK_MODEL"),
    api_key=os.getenv("DEEPSEEK_API_KEY"),
	base_url=os.getenv("DEEPSEEK_API_BASE")
)

prompt = ChatPromptTemplate("如何学习Python?")
chain = prompt | llm | StrOutputParser()


for chunk in chain.stream({}):
	print(chunk,end="",flush=True)

end=""参数的作用是:默认情况下,print()会在结尾添加换行符\n,设置end=""后,不会添加换行符,使下一个 chunk 继续在同一行输出。 flush=True参数的作用是:标准输出通常有缓冲区,默认情况下不会立即显示内容,设置flush=True强制立即将内容输出到终端

1. 解析为布尔值

下面的代码将大模型的结果转换成了bool值。

from langchain.output_parsers.boolean import BooleanOutputParser
prompt = ChatPromptTemplate([

    #需要大模型返回yes或no,才能被BooleanOutputParser解析
    ("system", "你来判断这个人是否适合结婚,请用yes或no回答"),
    ("user", "{input}")
])

parser = BooleanOutputParser();
chain = prompt | llm | parser
response = chain.invoke(
    {"input": "脾气差,人品差,不顾家,收入低"}
)
#使用解析器可以直接获取结果,不需要使用response.content获取结果
print(response)

2. 解析为json格式

#注意这里是从langchain的核心库引入
from langchain_core.output_parsers.json import JsonOutputParser

prompt = ChatPromptTemplate([
    ("system", "你是一个格式转换助手,将我输入的内容转换为JSON格式。"),
    ("human", "请将以下内容转换为JSON格式:{input}")
])

parser = JsonOutputParser();
chain = prompt | llm | parser
response = chain.invoke(
    {"input": "我是晓舟,是一名程序员"}
)
print(response)

输出结果:

{'name': '晓舟', 'profession': '程序员'}

3. 解析规定结构数据



from langchain.output_parsers import ResponseSchema, StructuredOutputParser

prompt = ChatPromptTemplate([
    ("system", "你是一个格式转换助手,将我输入的内容转换为JSON格式。"),
    ("human", "请将以下内容转换为JSON格式:{input}")
])

schema = ResponseSchema(name="name", description="姓名")

schema2 = ResponseSchema(name="age", description="年龄")

schema3 = ResponseSchema(name="job", description="职业")

response_schemas = [schema, schema2, schema3]

output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

chain = prompt | llm | output_parser
response = chain.invoke(
    {"input": "我是晓舟,我的工作是程序员,我今年39岁"}
)
print(response)

输出结果

{'name': '晓舟', 'job': '程序员', 'age': 39}

这里需要注意:LLM 必须返回有效的 JSON 格式,否则会抛出解析错误。格式指令需清晰明确,必要时可在提示中提供示例。

与JsonOutputParser对比StructuredOutputParser可以设置具体的格式要求,适合更严格的格式要求场景。