Model I/O
模型是LangChain构建应用的核心,是整个应用的发动机。使用模型的过程可以拆解为三部分:输入提示、调用模型和输出解析。简单来说就是给定输入然后调用模型最后由模型输出答案。但这每个部分都很重要,要有好的输入提示才能更好的利用这个发动机,好的发动机才能发挥出更大的优势,输出结果也需要根据需求处理返回的数据。可以说输入提示和输出解析决定了应用的上限,模型决定了应用的下限。
在模型I/O的每个环节,LangChain都提供了模板和工具,可快捷地形成调用个各种语言模型的接口。
- 提示模板:你可以创建LangChain模板,根据实际需求动态选择不同的输入,针对特定的任务和应用调整输入。
- 语言模型:LangChain允许通过接口来调用语言模型。这意味着无论要使用哪种语言模型,都可以通过同一种方式进行调用,这样就提高了灵活性和便利性。
- 输出解析:LangChain还提供了从模型输出中提取信息的功能。通过输出解析器,可以精确地从模型输出中获取需要的信息,更重要的是还可以把大模型给回的非结构文本转换成程序可以处理的结构化数据。
提示模板
提示模板就是所提出问题的一种文本格式,通过模板和输入数据向模型提出问题。如希望为销售的每一种鲜花生成一段简介文案,当员工或顾客想了解某种鲜花时,调用该模板就会生成合适的文字。【就如一个中介一样,用户不会直接询问模型,而是由构建的应用代为询问然后回答】
提示模板的生成方式如下:
# 导入LangChain中的提示模板
from langchain.prompts import PromptTemplate
# 创建原始模板
template = """您是一位专业的鲜花店文案撰写员。\n
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
# 打印LangChain提示模板的内容
print(prompt)
模板有两个变量{flower_name}和 {price}表示花的名称和价格,这两个值是模板里的占位符,在实际使用该模板时会被具体的值替换。
代码中的from_template是一个类方法,它允许我们直接从一个字符串模板中构建一个PromptTemplate对象。这个对象就是作为LangChain中的提示模板,它包括输入变量、输出解释器、模板格式和是否验证模板等。除了这个类方法,LangChain还提供多个类和函数,也为各种应用场景设计了很多内置模板,使构建和使用提示变得更容易。
以下是上方代码的输出内容:
input_variables=['flower_name', 'price']
output_parser=None partial_variables={}
template='/\n您是一位专业的鲜花店文案撰写员。
\n对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?\n'
template_format='f-string'
validate_template=True
语言模型
LangChain中支持的模型有三大类:
- 大语言模型(LLM):也叫Text Model,这些模型将文本字符串作为输入,并返回文本字符串作为输出。
- 聊天模型(Chat Model):主要代表Open AI的ChatGPT系列模型,这些模型通常由语言模型支持,但他们的API更加结构化。具体来说就是这些模型将聊天消息作为输入,并返回聊天消息。
- 文本嵌入模型(Embedding Model):这些模型将文本作为输入并返回浮点数列表,也就是Embedding。文本嵌入模型负责把文档存入向量数据库。
使用PromptTemplate对象的prompt方法,传入参数即可得转换后的问题。
import os
# 导入LangChain中的OpenAI模型接口
from langchain_openai import OpenAI
# 创建模型实例
model = OpenAI(model_name='gpt-3.5-turbo-instruct')
# 输入提示
input = prompt.format(flower_name=["玫瑰"], price='50')
# 得到模型的输出
output = model.invoke(input)
# 打印输出内容
print(output)
输出解析
很多时候模型返回的内容形式上并不是我们最终想要的,更多情况下我们需要的是程序能够直接处理的,结构化的数据。
此时我们就可以使用LangChain的输出解释器。
比如上述希望返回的格式是如下:
- description:鲜花的说明文本
- reason:解释一下为何要这样写上面的文案
则可使用langchain下output_parsers中的StructuredOutputParser类和ResponseSchema类,ResponseSchema类用来定义响应格式的字段,StructuredOutputParser类用来创建输出解释器;然后通过输出解析器对象的get_format_instructions()方法获取输出的格式说明,再根据原始的字符串模板和输出的格式说明创建一个新的提示模板,这样发给模型的提示模板就包含输出说明了。最后得到的结果将尽最大可能遵循我们的指示,以便于输出解析器进行解析。