CSV解析器
当想返回以逗号分隔开的项目列表时,可以使用输出解析器。
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
# 分隔列表解析器(CSV解析器)
output_parser = CommaSeparatedListOutputParser()format_instructions = "您的响应应该是csv格式的逗号分隔值的列表,例如:`内容1, 内容2, 内容3`"
prompt = PromptTemplate(template="{format_instructions}\n请列出五个 {subject}.",input_variables=["subject"],partial_variables={"format_instructions": format_instructions},
)
chain = prompt | chat | output_parser
chain.invoke({"subject": "冰淇淋口味"})
输出结果:
[‘香草’, ‘巧克力’, ‘草莓’, ‘抹茶’, ‘薄荷’]
日期时间解析器
此 OutputParser 可用于将 LLM 输出解析为日期时间格式。
from langchain.output_parsers import DatetimeOutputParser
# 时间解析器
output_parser = DatetimeOutputParser()
template = """回答用户的问题:{question}{format_instructions}"""# 此时是英文的format_instructions 简介
format_instructions=output_parser.get_format_instructions()
# 重定义成中文
format_instructions='''响应的格式用日期时间字符串:“%Y-%m-%dT%H:%M:%S.%fZ”。示例: 1898-05-31T06:59:40.248940Z, 1808- 10-20T01:56:09.167633Z、0226-10-17T06:18:24.192024Z仅返回此字符串,没有其他单词!'''
prompt = PromptTemplate.from_template(template,partial_variables={"format_instructions":format_instructions },
)chain = prompt | chat | output_parser
output = chain.invoke({"question": "比特币是什么时候创立的?"})
output
输出结果:
datetime.datetime(2009, 1, 3, 18, 15)
枚举解析器
from langchain.output_parsers.enum import EnumOutputParserfrom enum import Enum
# 创建枚举对象
class Colors(Enum):RED = "红色"BROWN = "棕色"BLACK = "黑色"WHITE = "白色"YELLOW = "黄色"parser = EnumOutputParser(enum=Colors)#%%
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAIpromptTemplate = PromptTemplate.from_template("""{person}的皮肤主要是什么颜色?{instructions}"""
)# 翻译成中文
instructions = "响应的结果请选择以下选项之一:红色、棕色、黑色、白色、黄色。不要有其他的内容"
prompt = promptTemplate.partial(instructions=instructions)
chain = prompt | chat | parser
print(chain.invoke({"person": "亚洲人"}))
输出结果:
<Colors.YELLOW: ‘黄色’>
Json解析器
from typing import Listfrom langchain.prompts import PromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
openai_api_key = "EMPTY"
openai_api_base = "http://127.0.0.1:1234/v1"
chat = ChatOpenAI(openai_api_key=openai_api_key,openai_api_base=openai_api_base,temperature=0.3,
)# 定义您想要的数据结构。
class Book(BaseModel):title: str = Field(description="书名")author: str = Field(description="作者")description: str = Field(description="书的简介")# 以及旨在提示语言模型填充数据结构的查询。
query = "请给我介绍学习中国历史的经典书籍"# Set up a parser + inject instructions into the prompt template.
parser = JsonOutputParser(pydantic_object=Book)# 此时是英文内容
format_instructions = parser.get_format_instructions()
# 自定义中文格式
format_instructions = '''输出应格式化为符合以下 JSON 结构的 JSON 实例。
JSON结构
{
‘title’: ‘书的标题’,
‘author’: ‘作者’,
‘description’: ‘书的简介’
}
'''
prompt = PromptTemplate(template="{format_instructions}\n{query}\n",input_variables=["query"],partial_variables={"format_instructions": format_instructions },
)chain = prompt | chat | parserchain.invoke({"query": query})
修复输出解析器
此输出解析器包装另一个输出解析器,如果第一个输出解析器失败,它会调用另一个 LLM 来修复任何错误。
但除了抛出错误之外,我们还可以做其他事情。具体来说,我们可以将格式错误的输出以及格式化的指令传递给模型并要求其修复。
对于这个例子,我们将使用上面的 Pydantic 输出解析器。如果我们传递一个不符合模式的结果,会发生以下情况:
from langchain.output_parsers import OutputFixingParsernew_parser = OutputFixingParser.from_llm(parser=parser, llm=chat)
重试解析器
虽然在某些情况下,可以仅通过查看输出来修复任何解析错误,但在其他情况下则不然。例如,输出不仅格式不正确,而且部分完整。考虑下面的例子。
from langchain.output_parsers import RetryOutputParser
retry_parser = RetryOutputParser.from_llm(parser=parser, llm=chat)