前言
LangChain实战课的第三节,介绍LangChain的模型I/O,感兴趣的小伙伴也可以看看之前的文章~
Model I/O
把对模型的使用过程拆解成三块,LangChain中这个过程被统称为 Model I/O(Input/Output)
- 输入提示(对应图中的Format)
- 调用模型(对应图中的Predict)
- 输出解析(对应图中的Parse)
(1)提示模板
- 把提示信息输入到模型中,创建LangChain模板,针对特定的任务调整输入。
# 导入LangChain中的提示模板
from langchain.prompts import PromptTemplate
# 创建原始模板
template = """您是一位专业的鲜花店文案撰写员。\n
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
# 打印LangChain提示模板的内容
print(prompt)
运行结果
- input_variables:输入变量
- template:模板
(2)语言模型
- LangChain允许使用通用接口来调用语言模型。
LangChain支持三大类模型
- 大语言模型(LLM),也叫Text Model,输入文本字符串,输出文本字符串。如:Open AI的text-davinci-003、Facebook的LLaMA、ANTHROPIC的Claude。
- 聊天模型(Chat Model),通常由语言模型支持,但API更加结构化,输入聊天消息列表,返回聊天消息。如:Open AI的ChatGPT系列模型。
- 文本嵌入模型(Embedding Model),输入文本,输出浮点数列表,把文档存入向量数据库。如:OpenAI的text-embedding-ada-002。
1. 调用语言模型
- 跟提示模板的代码一起使用
# 导入LangChain中的OpenAI模型接口
import os
from langchain_openai import ChatOpenAI
# 创建模型实例
model = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))
# 输入提示,实例化模板
input = prompt.format(flower_name=["玫瑰"], price="50")
# 得到模型的输出
output = model.invoke(input)
# 打印输出内容
print(output)
运行结果
2. 复用提示模板,同时生成多个鲜花的文案。
- 跟提示模板的代码一起使用
# 导入LangChain中的OpenAI模型接口
import os
from langchain_openai import ChatOpenAI
# 创建模型实例
model = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))
# 多种花的列表
flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]
# 生成多种花的文案
for flower, price in zip(flowers, prices):
# 使用提示模板生成输入
input_prompt = prompt.format(flower_name=flower, price=price)
# 得到模型的输出
output = model.invoke(input_prompt)
# 打印输出内容
print(output)
运行结果
LangChain调用模型的意义
- LangChain只需要定义一次模板,就可以生成各种不同的提示,切换到不同的模型不需要修改任何提示相关的代码
1. 使用Open AI API来完成上述功能代码
from openai import OpenAI # 导入OpenAI
import os
prompt_text = "您是一位专业的鲜花店文案撰写员。对于售价为{}元的{},您能提供一个吸引人的简短描述吗?" # 设置提示
flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]
# 循环调用Text模型的Completion方法,生成文案
for flower, price in zip(flowers, prices):
prompt = prompt_text.format(price, flower)
client = OpenAI()
response = client.chat.completions.create(
model=os.environ.get("LLM_MODELEND"),
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt},
],
max_tokens=100,
)
print(response.choices[0].message.content) # 输出文案
运行结果
2. 使用HuggingFaceHub中的开源模型来完成上述功能代码
配置操作:
-
要注册HUGGINGFACEHUB_API_TOKEN
笔者参考的这篇博文:如何获取HuggingFace的Access Token-CSDN博客
-
将HUGGINGFACEHUB_API_TOKEN配置到环境变量中
(类似详细操作见第一篇文章:LangChain实战课-开篇词)
-
HuggingFaceHub类在 LangChain 0.0.21 版本中已被弃用,并将在 1.0 版本中移除。建议使用langchain-huggingface包中的更新版本,该版本应通过以下方式导入和使用:安装更新的 langchain-huggingface 包
pip install -U langchain-huggingface从更新的包中导入 HuggingFaceEndpoint 类
from langchain_huggingface import HuggingFaceEndpoint创建模型实例
model = HuggingFaceEndpoint(repo_id="google/flan-t5-large")
import os
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
# 导入LangChain中的提示模板
from langchain.prompts import PromptTemplate
# 创建原始模板
template = """You are a flower shop assitiant。\n
For {price} of {flower_name} ,can you write something for me?
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
# 打印LangChain提示模板的内容
print(prompt)
# 导入LangChain中的OpenAI模型接口
from langchain_huggingface import HuggingFaceEndpoint
# 创建模型实例
model = HuggingFaceEndpoint(
repo_id="google/flan-t5-large",
max_new_tokens=512,
temperature=0.5,
huggingfacehub_api_token=os.environ.get("HUGGINGFACEHUB_API_TOKEN"),
)
# 输入提示
input = prompt.format(flower_name=["rose"], price="50")
# 得到模型的输出
output = model.invoke(input)
# 打印输出内容
print(output)
- 由于HuggingFaceHub需要外网访问,笔者尝试使用镜像
https://hf-mirror.com也未能连接成功,并且使用的AI练中学,磁盘空间不足以下载这个模型,因此没能跑通这个代码。请大佬们提供一些解决思路~
(3)输出解析
- 输出解析器,可以把返回的非结构化文本,转换成结构化数据,可以精确地获取需要的信息。
步骤:
①定义输出结构,鲜花的描述文案(description)和原因(reason)。
②获取输出格式说明(format_instructions)。
③根据原始的字符串模板和输出解析器格式说明创建新的提示模板(整合了输出解析结构信息)。
④通过新的模板生成模型的输入,得到模型的输出。
⑤整合到一个pandas DataFrame对象中
# 导入LangChain中的提示模板
from langchain.prompts import PromptTemplate
# 创建提示模板
prompt_template = """您是一位专业的鲜花店文案撰写员。
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?
{format_instructions}"""
# 通过LangChain调用模型
import os
from langchain_openai import ChatOpenAI
# 创建模型实例
model = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))
# 导入结构化输出解析器和ResponseSchema
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
# 定义我们想要接收的响应模式
response_schemas = [
ResponseSchema(name="description", description="鲜花的描述文案"),
ResponseSchema(name="reason", description="问什么要这样写这个文案"),
]
# 创建输出解析器
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 获取格式指示
format_instructions = output_parser.get_format_instructions()
# 根据模板创建提示,同时在提示中加入输出解析器的说明
prompt = PromptTemplate.from_template(
prompt_template, partial_variables={"format_instructions": format_instructions}
)
# 数据准备
flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]
# 创建一个空的DataFrame用于存储结果
import pandas as pd
df = pd.DataFrame(columns=["flower", "price", "description", "reason"]) # 先声明列名
for flower, price in zip(flowers, prices):
# 根据提示准备模型的输入
input = prompt.format(flower_name=flower, price=price)
# 获取模型的输出
output = model.invoke(input)
# 解析模型的输出(这是一个字典结构)
parsed_output = output_parser.parse(output.content)
# 在解析后的输出中添加“flower”和“price”
parsed_output["flower"] = flower
parsed_output["price"] = price
# 将解析后的输出添加到DataFrame中
df.loc[len(df)] = parsed_output
# 打印字典
print(df.to_dict(orient="records"))
# 保存DataFrame到CSV文件
df.to_csv("flowers_with_descriptions.csv", index=False)
运行结果
总结
①学到了LangChain中模型I/O的三个阶段:输入提示、调用模型、输出解析。
②输入提示模板:使用占位符自动处理变量的插入、便于代码维护和服用。
③调用模型:使用不同的模型只需要更改模型名称,无需修改代码。
④输出解析:提示模板可以嵌入对输出格式的定义,便于后续处理输出。
⑤注册了HUGGINGFACEHUB_API_TOKEN,学到HuggingFaceHub中开源模型的基本调用方法。