伴学笔记4

76 阅读7分钟

LangChain实战课:深入解析模型I/O与提示模板 模型I/O:输入、调用与输出解析 在LangChain中,对模型的使用过程可以拆解为三个关键环节:输入提示(Format)、调用模型(Predict)和输出解析(Parse)。这三个环节形成了一个整体,被称为Model I/O。

输入提示: 提示模板:LangChain允许我们创建模板,根据实际需求动态选择不同的输入。这些模板能够针对特定的任务和应用调整输入,从而优化模型的输出。 Prompt Engineering:提示工程的核心在于构建清晰、明确的指示,让模型能够更准确地理解并回答我们的问题。 调用模型: LangChain支持多种语言模型,包括大语言模型(LLM)、聊天模型(Chat Model)和文本嵌入模型(Embedding Model)。 通过LangChain的通用接口,我们可以轻松地调用不同的语言模型,而无需为每种模型编写特定的代码。 输出解析: LangChain提供了从模型输出中提取信息的功能,通过输出解析器,我们可以精确地从模型的输出中获取需要的信息。 输出解析器还能够将非结构化文本转换为程序可以处理的结构化数据。 构建提示模板 这里,我们希望为销售的每一种鲜花生成一段简介文案,那么每当你的员工或者顾客想了解某种鲜花时,调用该模板就会生成适合的文字。这个提示模板的生成方式如下:

导入LangChain中的提示模板

from langchain.prompts import PromptTemplate

创建原始模板

template = """您是一位专业的鲜花店文案撰写员。\n 对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗? """

根据原始模板创建LangChain提示模板

prompt = PromptTemplate.from_template(template)

打印LangChain提示模板的内容

print(prompt) 提示模板的具体内容如下:

input_variables=['flower_name', 'price'] output_parser=None partial_variables={} template='/\n您是一位专业的鲜花店文案撰写员。 \n对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?\n' template_format='f-string' validate_template=True 这个模板包含两个变量:{flower_name} 和 {price},它们将在实际使用时被具体的值替换。

调用语言模型 LangChain中支持的模型有三大类。

大语言模型(LLM) ,也叫Text Model,这些模型将文本字符串作为输入,并返回文本字符串作为输出。Open AI的text-davinci-003、Facebook的LLaMA、ANTHROPIC的Claude,都是典型的LLM。 聊天模型(Chat Model),主要代表Open AI的ChatGPT系列模型。这些模型通常由语言模型支持,但它们的 API 更加结构化。具体来说,这些模型将聊天消息列表作为输入,并返回聊天消息。 文本嵌入模型(Embedding Model),这些模型将文本作为输入并返回浮点数列表,也就是Embedding。而文本嵌入模型如OpenAI的text-embedding-ada-002,我们之前已经见过了。文本嵌入模型负责把文档存入向量数据库,和我们这里探讨的提示工程关系不大。 然后,我们将调用语言模型,让模型帮我们写文案,并且返回文案的结果。

我们使用这个提示模板来生成提示,并将其输入到大语言模型中。例如,对于玫瑰:

设置OpenAI API Key

import os os.environ["OPENAI_API_KEY"] = '你的Open AI API Key'

导入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)
模型返回的输出可能是:“让你心动!50元就可以拥有这支充满浪漫气息的玫瑰花束,让TA感受你的真心爱意。”

让你心动!50元就可以拥有这支充满浪漫气息的玫瑰花束,让TA感受你的真心爱意。 复用提示模板,我们可以同时生成多个鲜花的文案:

导入LangChain中的提示模板

from langchain import PromptTemplate

创建原始模板

template = """您是一位专业的鲜花店文案撰写员。\n 对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗? """

根据原始模板创建LangChain提示模板

prompt = PromptTemplate.from_template(template)

打印LangChain提示模板的内容

print(prompt)

设置OpenAI API Key

import os os.environ["OPENAI_API_KEY"] = '你的Open AI API Key'

导入LangChain中的OpenAI模型接口

from langchain import OpenAI

创建模型实例

model = OpenAI(model_name='gpt-3.5-turbo-instruct')

多种花的列表

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)

模型的输出如下:

这支玫瑰,深邃的红色,传递着浓浓的深情与浪漫,令人回味无穷! 百合:美丽的花朵,多彩的爱恋!30元让你拥有它! 康乃馨—20元,象征爱的祝福,送给你最真挚的祝福。

huggingface.co/join huggingface.co/join

上面的代码是直接使用Open AI和带有 {} 占位符的提示语,同时生成了三种鲜花的文案。看起来也是相当简洁。 下面,我们用完全相同的提示模板来生成提示,并发送给HuggingFaceHub中的开源模型来创建文案。(注意:需要注册HUGGINGFACEHUB_API_TOKEN)

导入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) import os os.environ['HUGGINGFACEHUB_API_TOKEN'] = '你的HuggingFace API Token'

导入LangChain中的OpenAI模型接口

from langchain_community.llms import HuggingFaceHub

创建模型实例

model= HuggingFaceHub(repo_id="google/flan-t5-large")

输入提示

input = prompt.format(flower_name=["rose"], price='50')

得到模型的输出

output = model(input)

打印输出内容

print(output)

输出:

i love you 真是一分钱一分货,当我使用较早期的开源模型T5,得到了很粗糙的文案 “i love you”(哦,还要注意T5还没有支持中文的能力,我把提示文字换成英文句子,结构其实都没变)。

当然,这里我想要向你传递的信息是:你可以重用模板,重用程序结构,通过LangChain框架调用任何模型。如果你熟悉机器学习的训练流程的话,这LangChain是不是让你联想到PyTorch和TensorFlow这样的框架——模型可以自由选择、自主训练,而调用模型的框架往往是有章法、而且可复用的。

因此,使用LangChain和提示模板的好处是:

代码的可读性:使用模板的话,提示文本更易于阅读和理解,特别是对于复杂的提示或多变量的情况。 可复用性:模板可以在多个地方被复用,让你的代码更简洁,不需要在每个需要生成提示的地方重新构造提示字符串。 维护:如果你在后续需要修改提示,使用模板的话,只需要修改模板就可以了,而不需要在代码中查找所有使用到该提示的地方进行修改。 变量处理:如果你的提示中涉及到多个变量,模板可以自动处理变量的插入,不需要手动拼接字符串。 参数化:模板可以根据不同的参数生成不同的提示,这对于个性化生成文本非常有用。 那我们就接着介绍模型 I/O的最后一步,输出解析。

输出解析与结构化数据 虽然上述输出看起来不错,但在实际应用中,我们可能希望获得结构化的数据。这时,输出解析器就派上了用场。

比如说,在这个文案中,如果你希望模型返回两个字段:

description:鲜花的说明文本 reason:解释一下为何要这样写上面的文案 ————————————————