langchain系列:Model I/O模块之-Prompts

文章目录

  • Model I/O简介
    • 输入部分(Prompts)
      • PromptTemplate
        • from_template
      • ChatPromptTemplate

  langchain是基于大语言模型而开发的一个框架,既然是基于大语言模型,自然最重要的就是先要介绍Model I/O模块。

Model I/O简介

  Model I/O模块其实就是提供了语言模型的基础构建接口,那既然是提供构建的接口,我们首先要知道,构建一个模型到底需要哪一些部分。官方给出了一个图例如下:
langchain系列:Model I/O模块之-Prompts_第1张图片
  从上面可以看出,在整个工作的流程中,数据通过一定的格式(Format)组织起来,送入到模型中进行预测(Predict),最后将预测结果进行解析(Parse)输出。
从上面可以总结出,整个模型的构建包括了:

  • 输入部分
  • 语言模型构建部分
  • 输出部分

输入部分(Prompts)

  在LLM领域,我们把模型的输入称作Prompts,因为对于大语言模型来说,你如果要用好他,通常不会简单的抛出一个问题给他,而是会给他一些前提设定,甚至还会给他看一些案例,诸如你问chatgpt:“能不能帮我翻译一下下面的英文”,此时最好是不要直接发问,而是应该先和模型说:你是一个中英翻译专家,这样它才能回答得更好。所以我们可以大致拆解一下一个prompt大致有哪些东西组成

  • 对语言模型的身份设定描述(可选)
  • 一些回答案例,帮助回答得更好(可选)
  • 具体要问的问题(必选)

langchain针对以上的prompts的三个组成部分,提供了一些组件和接口来实现。

PromptTemplate

  PromptTemplate提供了语言模型输入的构建方式,下面我先抛出代码,然后进行解释

from langchain import PromptTemplate

prompt = PromptTemplate(
    input_variables=['product'],
    template="""
        what is a good name for a company that makes {product}?
    """
)

print(prompt.format(product="colorful socks"))
what is a good name for a company that makes colorful socks?

  在PromptTemplate中,需要指定两个东西:

template:我们要发问的问题,但是当我们用户在发问的时候,并不需要每一次都输入完整的这句话,而只需要输入一小部分,这一小部分就是用中括号括起来的变量,这个变量需要在input_variables变量中指定;
input_variables:指定template中实际需要用户输入的变量;

  从上面的解释可以看出,我们在对话的过程中,实际只需要输入input_variables的部分,其他的不需要重复输入,这也是PromptTemplate中有一个Template的原因,它是一个固定模板。同时也可以理解为什么最开始官方给的图中Format那里就像一个插槽一样,我们只需要讲用户输入的少部分数据插入到模板中,组成完整的prompt,然后送给模型就可以了。

改进一:设定模型角色
  为了让模型回答得更好,可以设定模型的角色,其实也就是添加了一句说明

from langchain import PromptTemplate

prompt = PromptTemplate(
    input_variables=['product'],
    template="""
        You are a naming consultant for new companies.
        what is a good name for a company that makes {product}?
    """
)

print(prompt.format(product="colorful socks"))

from_template

  当然以上的初始化需要显示的在input_variables中指定我们需要输入的变量,如果你角色这很麻烦,PromptTemplate还提供了一个from_template方法,让langchain自动识别出需要输入的变量。

from langchain import PromptTemplate
template1 = """
    You are a naming consultant for new companies.
    what is a good name for a company that makes {product}?
"""
prompt = PromptTemplate.from_template(template1)
print(prompt.format(product="colorful socks"))

ChatPromptTemplate

 在langchain中,对话模型(Chat Model)和大语言模型(LLMs)是稍有区分的,对话模型可以理解为是LLMs高级封装,它有更规范的输入和输出,而规范的输出就是通过ChatPromptTemplate来实现的。
  在上面一小节中,是针对LLMs的,可以看出,我们关于模型的身份设定,人类提问是不做区分的,就在一个字符串中一起描述就行,但是在Chat Model是严格区分的。分别用SystemMessagePromptTemplate和SystemMessagePromptTemplate来指定。

下面对上一小节的内容进行改造

from langchain.prompts import (
    ChatPromptTemplate,
    PromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

system_prompt = PromptTemplate(
    input_variables=['test'],
    template="""
        You are a naming consultant for new {test}.
    """
)
system_message_prompt = SystemMessagePromptTemplate(prompt=system_prompt)
human_prompt = PromptTemplate(
    input_variables=['product'],
    template="""
        what is a good name for a company that makes {product}?
    """
)
human_message_prompt = HumanMessagePromptTemplate(prompt=human_prompt)

chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt,human_message_prompt])
print(chat_prompt.format_prompt(test='compies',product='colorful socks'))

 可以看出,在这里对于模型身份的设定,会用SystemMessagePromptTemplate进行包装,而我们的提问,会用HumanMessagePromptTemplate进行包装。

你可能感兴趣的:(langchain,深度学习,langchain,人工智能)