LangChain之Model IO

Model I/O

可以把对模型的使用过程拆解成三块:输入提示(Format)、调用模型(Predict)、输出解析(Parse)

  1. 提示模板
    LangChain的模板允许动态选择输入,根据实际需求调整输入内容,适用于各种特定任务和应用。

  2. 语言模型
    LangChain提供通用接口调用不同类型的语言模型,提升了灵活性和使用便利性。

  3. 输出解析
    利用LangChain的输出解析功能,精准提取模型输出中所需信息,避免处理冗余数据,同时将非结构化文本转换为可处理的结构化数据,提高信息处理效率。

这三块形成了一个整体,在LangChain中这个过程被统称为Model I/O。针对每块环节,LangChain都提供了模板和工具,可以帮助快捷地调用各种语言模型的接口。

提示模版

在LangChain的Model I/O中,提示模板是其组成之一,语言模型的提示是用户提供的一组指令或输入,用于指导模型的响应,帮助模型理解上下文并生成相关且连贯的基于语言的输出,例如回答问题、完成句子或参与某项活动、对话。

PromptTemplates是LangChain中的一个概念,通过接收原始用户输入,并返回一个准备好传递给语言模型的信息(即提示词 prompt)。

通俗点说,prompt template是一个模板化的字符串,可以用来生成特定的提示(prompts)。你可以将变量插入到模板中,从而创建出不同的提示。这对于重复生成相似格式的提示非常有用,尤其是在自动化任务中。

LangChain提示模板特点

  1. 清晰易懂的提示:提高提示文本的可读性,使其更易于理解,尤其是在处理复杂或涉及多个变量的情况下。
  2. 增强可重用性:使用模板,可以在多个地方重复使用,简化代码,无需重复构建提示字符串。
  3. 简化维护:使用模板后,如果需要更改提示内容,只需修改模板,无需逐个查找所有用到该提示的地方。
  4. 智能处理变量:模板可以自动处理变量的插入,无需手动拼接字符串。
  5. 参数化生成:模板可以根据不同的参数生成不同的提示,有助于个性化文本生成。

LangChain提示模板类型

  1. LLM提示模板PromptTemplate:常用的String提示模板
  2. 聊天提示模板ChatPromptTemplate:常用的Chat提示模板,用于组合各种角色的消息模板,传入聊天模型。消息模板包括:ChatMessagePromptTemplate、HumanMessagePromptTemplate、AllMessagePromptTemplate、SystemMessagePromptTemplate等
  3. 样本提示模板FewShotPromptTemplate:通过示例来教模型如何回答
  4. 部分格式化提示模板:提示模板传入所需值的子集,以创建仅期望剩余值子集的新提示模板
  5. 管道提示模板PipelinePrompt:用于把几个提示组合在一起使用
  6. 自定义模板:允许基于其他模板类来定制自己的提示模板

提示模版的案例讲解

1.模版导入

我们需要使用LangChain的提示词模版我们需要再代码中导入模版,具体的导入代码为

from langchain.prompts import PromptTemplate
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts import ChatPromptTemplate
from langchain.prompts import (
    ChatMessagePromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate
)

2.创建提示模版

我们先来看看原始模版的应用

# 导入Langchain中的提示模板
from langchain.prompts import PromptTemplate

# 创建原始模板
template = "您是一位专业的程序员。\n对于信息〔text〕进行简短描述"

# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)

# 打印LangChain提示模板的内容
print(prompt)
print("=" * 50)
print("prompt format(text='langchain')")

3.使用提示模版

from langchain_openai import ChatOpenAI
from dotenv import load_dotenv

load_dotenv()

openai_api_key = "sk-evrvawfnfgrqevzgaofaliglryrmaqrvksidhriwiiokboix"
openai_api_base = "https://api.siliconflow.cn/v1"

from langchain.prompts import PromptTemplate

prompt = PromptTemplate(
    input_variables=["text"],
    template="您是一位专业的程序员。\n对于信息 {text} 进行简短描述",
)

input = prompt.format(text="LangChain")

llm = ChatOpenAI(
    model="Qwen/Qwen2.5-14B-Instruct",
    openai_api_key=openai_api_key,
    openai_api_base=openai_api_base,
)

output = llm.invoke(input)

# 打印LangChain提示模版的内容
print(output)

ChatPromptTemplate

from langchain_openai import ChatOpenAI
from dotenv import load_dotenv

load_dotenv()

openai_api_key = "sk-evrvawfnfgrqevzgaofaliglryrmaqrvksidhriwiiokboix"
openai_api_base = "https://api.siliconflow.cn/v1"

from langchain.prompts import ChatPromptTemplate

template = "你是一个翻译专家,擅长将{input_language}翻译为{output_language}语言"
human_template = "{text}"

chat_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", template),
        ("human", "{text}"),
    ]
)

messages = chat_prompt.format_messages(
    input_language="英文", output_language="中文", text="I love large language models."
)
print(messages)

llm = ChatOpenAI(
    model="Qwen/Qwen2.5-14B-Instruct",
    openai_api_key=openai_api_key,
    openai_api_base=openai_api_base,
)

output = llm.invoke(messages)

# 打印内容
print(output.content)

  1. PromptTemplate

  2. 用途:PromptTemplate主要是为标准的文本生成任务设计的,用于生成非对话式的提示词。它可以用于各种文本生成任务,如文章撰写、摘要生成、问题回答等。

  3. 格式:它通常常用于生成一次性或非交互式的输出,不需要维持对话的状态。

  4. 功能:PromptTemplate允许用户插入变量,根据模板生成最终的提示词。这些变量可以是静态的,也可以是动态生成的。

  5. ChatPromptTemplate

  6. 用途:ChatPromptTemplate是专门为对话系统设计的,用于生成对话式的提示词。它适用于聊天机器人、对话模型等需要持续对话的场景。

  7. 格式:它不仅包含要发送给模型的文本,还包括对话的历史信息,帮助模型理解上下文。

  8. 功能:ChatPromptTemplate同样支持变量插入,但它还额外支持对话历史的管理,使得生成的提示词能够包含之前的对话回合,从而在对话中保持连贯性。

在比较复杂的聊天场景中,我们还可以通过LangChain提供的不同类型的MessagePromptTemplate来灵活处理。最常用的是AIMessagePromptTemplate、SystemMessagePromptTemplate和HumanMessagePromptTemplate,分别用于创建人工智能消息、系统消息和人工消息。比如上面的案例我们可以修改为使用这些模板来更好地管理和区分不同类型的消息,从而提高聊天系统的效率和用户体验

对于这种拆分大家可以不太清楚应该要怎么来选择,直接使用 ChatPromptTemplate 与拆分为 SystemMessagePromptTemplate 和 HumanMessagePromptTemplate 的区别如下:

  • 直接性:使用 ChatPromptTemplate 可以更直接地定义整个对话流程,而拆分模板则需要分别定义系统消息和用户消息,然后组合它们。
  • 灵活性:拆分模板提供了更高的灵活性,允许更精细地控制对话的不同部分。例如,你可能想要在对话的不同阶段改变系统消息,或者根据不同的用户输入使用不同的模板。
  • 可读性和维护性:拆分模板可能使得代码更加模块化,从而提高可读性和维护性。每个模板都有明确的职责,这有助于在未来修改或扩展对话系统时更容易理解和修改。
  • 复杂性:直接使用 ChatPromptTemplate 可能会更简单,特别是对于简单的对话场景。然而,对于复杂的对话系统,拆分模板可能更有助于管理复杂性。

4.少量样本实例

少量样本示例的提示模板,基于LLM模型与聊天模型,可分别使用FewShotPromptTemplate或FewShotChatMessagePromptTemplate,两者使用基本一致。

创建示例集:
创建一些提示样本,每个示例都是一个字典,其中键是输入变量,值是输入变量的值。

examples = [
    {"input": "2+2", "output": "4", "description": "加法运算"},
    {"input": "5-2", "output": "3", "description": "减法运算"}
]
from langchain.prompts import PromptTemplate
from langchain.prompts.few_shot import FewShotPromptTemplate

# 定义示例集
examples = [
    {"input": "2+2", "output": "4", "description": "加法运算"},
    {"input": "5-2", "output": "3", "description": "减法运算"}
]

# 创建提示模板,配置一个提示模板,将一个示例格式化为字符串
prompt_template = "你是一个数学专家,算式:{input} 值:{output} 使用:{description}"

# 使用PromptTemplate创建提示样本
prompt_sample = PromptTemplate.from_template(prompt_template)

# 创建一个FewShotPromptTemplate对象
prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=prompt_sample,
    suffix="你是一个数学专家,算式: {input}, 值: {output}",
    input_variables=["input", "output"]
)

print(prompt.format(input="2 * 5", output="10"))
posted @ 2025-03-18 10:22  Michael_Z  阅读(64)  评论(0)    收藏  举报