Model I/O | 豆包MarsCode AI刷题

108 阅读5分钟

模型的使用

  • 输入提示(对应图中的Format)
  • 调用模型(对应图中的Predict)
  • 输出解析(对应图中的Parse)

image.png

在模型 I/O的每个环节,LangChain都为调用各种语言模型的接口提供了模板和工具

  1. 提示模板:将提示信息输入到模型中,通过创建LangChain模板,根据实际需求动态选择不同的输入,针对特定的任务和应用调整输入。
  2. 语言模型:通过通用接口来调用语言模型。
  3. 输出解析:LangChain可以从模型输出中提取信息。通过输出解析器,可以精确地从模型的输出中获取需要的信息。

提示模板

语言模型是个无穷无尽的宝藏,人类的知识和智慧,好像都封装在了这个“魔盒”里面了。但是,怎样才能解锁其中的奥秘,那可就是仁者见仁智者见智了。所以,现在“提示工程”这个词特别流行,所谓Prompt Engineering,就是专门研究对大语言模型的提示构建。

提示模板的生成方式如下:

# 导入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

“模板”就是一段描述某种鲜花的文本格式,它是一个 f-string,其中有两个变量 {flower_name} 和 {price} 表示花的名称和价格,类似于C语言中格式化输出中的占位符,在实际使用时会被具体的值替换。

代码中的from_template是一个类方法,我们可以从一个字符串模板中创建一个PromptTemplate对象。

因此PromptTemplate的from_template方法就是将一个原始的模板字符串转化为一个PromptTemplate对象,这个对象就是LangChain中的提示模板

语言模型

LangChain中支持的模型有三大类。

  1. 大语言模型(LLM) ,这些模型将文本字符串作为输入,并返回文本字符串作为输出。
  2. 聊天模型(Chat Model),主要代表Open AI的ChatGPT系列模型。这些模型通常由语言模型支持,但它们的 API 更加结构化。
  3. 文本嵌入模型(Embedding Model),这些模型将文本作为输入并返回浮点数列表,也就是Embedding。

在完成上述代码操作后,我们就可以调用语言模型,让模型帮我们写文案,并且返回文案的结果。

input = prompt.format(flower_name=["玫瑰"], price='50') 这行代码的作用是将模板实例化,此时将 {flower_name} 替换为 "玫瑰"{price} 替换为 '50',形成了具体的提示:“您是一位专业的鲜花店文案撰写员。对于售价为 50 元的玫瑰,您能提供一个吸引人的简短描述吗?”

接收到这个输入,调用模型之后,得到的输出如下:

让你心动!50元就可以拥有这支充满浪漫气息的玫瑰花束,让TA感受你的真心爱意。

若想同时生成多个鲜花的文案,复用模板即可

LangChain和直接调用OpenAI相比,的优势所在于我们只需要定义一次模板,就可以用它来生成各种不同的提示。并且使用LangChain提示模板,我们还可以很方便地把程序切换到不同的模型,而不需要修改任何提示相关的代码。

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

  1. 代码的可读性:使用模板,提示文本更易于阅读和理解。
  2. 可复用性:模板可以在多个地方被复用,让代码更简洁。
  3. 维护:如果后续需要修改提示,使用模板的话,只需要修改模板就可以。
  4. 变量处理:如果提示中涉及到多个变量,模板可以自动处理变量的插入,不需要手动拼接字符串。
  5. 参数化:模板可以根据不同的参数生成不同的提示。

输出解析

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

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

A:“文案是:让你心动!50元就可以拥有这支充满浪漫气息的玫瑰花束,让TA感受你的真心爱意。为什么这样说呢?因为爱情是无价的,50元对应热恋中的情侣也会觉得值得。”

B:{description: "让你心动!50元就可以拥有这支充满浪漫气息的玫瑰花束,让TA感受你的真心爱意。" ; reason: "因为爱情是无价的,50元对应热恋中的情侣也会觉得值得。"}

因为LangChain解析器的存在,A的笼统言语,而B结构清晰。

之后可以将结果存入CSV文件中。

我们希望模型生成的答案包含两部分:鲜花的描述文案和原因。所以定义了response_schemas列表,包含两个ResponseSchema对象,分别对应这两部分的输出。

根据这个列表,通过StructuredOutputParser.from_response_schemas方法创建了一个输出解析器。

然后,通过输出解析器对象的get_format_instructions()方法获取输出的格式说明(format_instructions),再根据原始的字符串模板和输出解析器格式说明创建新的提示模板(这个模板就整合了输出解析结构信息)。再通过新的模板生成模型的输入,得到模型的输出。

对于每一个鲜花和价格组合,都使用 output_parser.parse(output) 把模型输出的文案解析成之前定义好的数据格式,也就是一个Python字典,这个字典中包含了description 和 reason 这两个字段的值,最后,把所有信息整合到一个pandas DataFrame对象中。