LangChain系列文章
- LangChain 实现给动物取名字,
- LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
- LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
- LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
- LangChain 5易速鲜花内部问答系统
- LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
- LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
- LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
- LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
- LangChain 10思维链Chain of Thought一步一步的思考 think step by step
- LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
- LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
输出解析器
语言模型输出文本。但很多时候,您可能希望获得比只有文本更结构化的信息。这就是输出解析器的作用。
输出解析器是帮助构建语言模型响应结构的类。输出解析器必须实现两种主要方法:
- “Get format instructions获取格式指令”:返回一个包含语言模型输出应该如何格式化的指令的字符串的方法。
- “Parse解析”:接受一个字符串(假设是语言模型的响应)并将其解析成某种结构的方法。
然后还有一个可选的方法:
“Parse with prompt带提示解析”:接受一个字符串(假设是语言模型的响应)和一个提示(假设是生成这种响应的提示)并将其解析成某种结构的方法。在事件中,OutputParser希望重试或以某种方式修复输出,并且需要提示中的信息来这样做时,大部分提供提示。
1. 列表输出解析器List parser
这个输出解析器可以在你想要返回逗号分隔的项目列表时使用。
代码文件OutputParsers/text_list_parser.py
# 导入 Langchain 库的 OpenAI 模块,用于与 OpenAI 的 GPT-3 模型进行交互。
from langchain.llms import OpenAI
# 导入 PromptTemplate 模块,用于创建和管理提示模板。
from langchain.prompts import PromptTemplate
# 导入输出解析器,用于解析生成文本的格式。
from langchain.output_parsers import CommaSeparatedListOutputParser
# 导入 dotenv 库,用于从 .env 文件加载环境变量,管理敏感数据,如 API 密钥。
from dotenv import load_dotenv
# 调用 load_dotenv 函数来加载 .env 文件中的环境变量。
load_dotenv()
# 创建一个 OpenAI 类的实例,用于生成文本。
# 指定使用的模型是 "text-davinci-003",这是一个高级的 GPT-3 模型。
# 设置 temperature 参数,影响文本生成的随机性和创造性。
# 设置 max_tokens,限制生成文本的最大长度。
llm = OpenAI(
model="text-davinci-003",
temperature=0.7,
max_tokens=600
)
# 创建一个输出解析器实例,专门用于解析逗号分隔的列表。
output_parser = CommaSeparatedListOutputParser()
# 获取格式化指令,用于在提示模板中指定输出格式。
format_instructions = output_parser.get_format_instructions()
# 创建一个提示模板实例。
# 模板包含了生成特定主题列表的指令,例如列出5种水果。
prompt = PromptTemplate(
template="List 5 {subject}.\n{format_instructions}",
input_variables=['subject'],
partial_variables={'format_instructions': format_instructions}
)
# 格式化提示,将主题设置为“fruits”。
_input = prompt.format(subject="fruits")
# 使用 llm 实例生成回应。
output = llm(_input)
# 使用输出解析器解析生成的回应。
response = output_parser.parse(output)
# 打印解析后的回应。
print(response)
输出结果
zgpeace at zgpeaces-MBP in ~/Workspace/LLM/langchain-llm-app (develop●) (.venv)
$ python OutputParsers/text_list_parser.py
['Apple', 'Banana', 'Orange', 'Strawberry', 'Watermelon']
2. 自动修复解析器 Auto-fixing parser
该输出解析器包装另一个输出解析器,如果第一个解析器失败,它会调用另一个LLM来修复任何错误。
但除了抛出错误之外,我们还可以做其他事情。具体来说,我们可以将格式不正确的输出以及格式化的指令传递给模型,并要求其进行修复。
在这个例子中,我们将使用上面的Pydantic输出解析器。如果我们将一个不符合架构的结果传递给它,会发生什么呢?
# 导入 Langchain 库中的 ChatOpenAI 类,用于与 OpenAI 聊天模型进行交互。
from langchain.chat_models import ChatOpenAI
# 导入 PydanticOutputParser,用于将输出解析为 Pydantic 模型。
from langchain.output_parsers import PydanticOutputParser
# 导入 Pydantic BaseModel 类和 Field 函数,用于定义数据模型。
from langchain.pydantic_v1 import BaseModel, Field
from typing import List
# 导入 dotenv 库,用于从 .env 文件加载环境变量,管理敏感数据,如 API 密钥。
from dotenv import load_dotenv
# 调用 load_dotenv 函数来加载 .env 文件中的环境变量。
load_dotenv()
# 定义一个 Pydantic 数据模型,表示演员和他们参演的电影名称列表。
class Actor(BaseModel):
name: str = Field(description="The name of the actor")
film_names: List[str] = Field(description="list of names of films they starred in")
# 定义一个查询字符串,用于生成随机演员的电影作品列表。
actor_query = "Generate the filmography for a random actor."
# 创建一个 PydanticOutputParser 实例,用于解析 Pydantic 模型。
parser = PydanticOutputParser(pydantic_object=Actor)
# 定义一个格式不正确的字符串。
misformatted = "{'name': 'Tom Hanks', 'film_names': ['Forrest Gump']}"
# 打开注释则格式化报错: Expecting property name enclosed in double quotes: line 1 column 2
# parser.parse(misformatted)
# 导入 OutputFixingParser,用于修正输出格式错误。
from langchain.output_parsers import OutputFixingParser
# 创建一个 OutputFixingParser 实例,结合 Pydantic 解析器和 ChatOpenAI 模型。
new_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())
# 使用新解析器解析格式不正确的字符串,并打印结果。
response = new_parser.parse(misformatted)
print(response)
打开 parser.parse(misformatted)
报错
zgpeace at zgpeaces-MBP in ~/Workspace/LLM/langchain-llm-app (develop●) (.venv)
$ python OutputParsers/chat_auto_fixing_parser.py
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/langchain/output_parsers/pydantic.py", line 27, in parse
json_object = json.loads(json_str, strict=False)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/__init__.py", line 359, in loads
return cls(**kw).decode(s)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/zgpeace/Workspace/LLM/langchain-llm-app/OutputParsers/chat_auto_fixing_parser.py", line 20, in <module>
parser.parse(misformatted)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/langchain/output_parsers/pydantic.py", line 33, in parse
raise OutputParserException(msg, llm_output=text)
langchain.schema.output_parser.OutputParserException: Failed to parse Actor from completion {'name': 'Tom Hanks', 'film_names': ['Forrest Gump']}. Got: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
注释掉 #parser.parse(misformatted)
的输出
zgpeace at zgpeaces-MBP in ~/Workspace/LLM/langchain-llm-app (develop●) (.venv)
$ python OutputParsers/chat_auto_fixing_parser.py
name='Tom Hanks' film_names=['Forrest Gump']
代码
https://github.com/zgpeace/pets-name-langchain/tree/develop
参考
https://python.langchain.com/docs/modules/model_io/output_parsers/