第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可以设置具体的格式要求,适合更严格的格式要求场景。