Skip to main content

自定义提示模板 Custom prompt template

假设我们希望LLM根据函数名称生成英语语言的解释。为了实现这个任务,我们将创建一个自定义的提示模板,该模板以函数名称作为输入,并格式化提示模板以提供函数的源代码。

为什么需要自定义提示模板?

LangChain提供了一组默认的提示模板,可以用于生成各种任务的提示。然而,可能会有一些情况下默认的提示模板无法满足您的需求。例如,您可能希望创建一个具有特定动态指令的提示模板,以适应您的语言模型。在这种情况下,您可以创建一个自定义的提示模板。

请查看当前的默认提示模板集合这里

创建自定义提示模板

基本上有两种不同的提示模板可用 - 字符串提示模板和聊天提示模板。字符串提示模板提供一个简单的字符串格式的提示,而聊天提示模板则生成一个更结构化的提示,用于与聊天API一起使用。

在本指南中,我们将使用字符串提示模板创建一个自定义提示。

要创建一个自定义的字符串提示模板,有两个要求:

  1. 它具有一个input_variables属性,用于公开提示模板所期望的输入变量。
  2. 它公开一个format方法,该方法接受与期望的input_variables相对应的关键字参数,并返回格式化后的提示。

我们将创建一个自定义的提示模板,该模板以函数名称作为输入,并格式化提示以提供函数的源代码。为了实现这一点,让我们首先创建一个函数,该函数将根据函数名称返回函数的源代码。

import inspect

def get_source_code(function_name):
# 获取函数的源代码
return inspect.getsource(function_name)

接下来,我们将创建一个自定义的提示模板,该模板以函数名称作为输入,并格式化提示模板以提供函数的源代码。

from langchain.prompts import StringPromptTemplate
from pydantic import BaseModel, validator

PROMPT = """\
Given the function name and source code, generate an English language explanation of the function.
Function Name: {function_name}
Source Code:
{source_code}
Explanation:
"""

class FunctionExplainerPromptTemplate(StringPromptTemplate, BaseModel):
"""A custom prompt template that takes in the function name as input, and formats the prompt template to provide the source code of the function."""

@validator("input_variables")
def validate_input_variables(cls, v):
"""Validate that the input variables are correct."""
if len(v) != 1 or "function_name" not in v:
raise ValueError("function_name must be the only input_variable.")
return v

def format(self, **kwargs) -> str:
# 获取函数的源代码
source_code = get_source_code(kwargs["function_name"])

# 生成要发送给语言模型的提示
prompt = PROMPT.format(
function_name=kwargs["function_name"].__name__, source_code=source_code
)
return prompt

def _prompt_type(self):
return "function-explainer"

API参考:

使用自定义提示模板

现在我们已经创建了一个自定义的提示模板,我们可以使用它来生成我们任务的提示。

fn_explainer = FunctionExplainerPromptTemplate(input_variables=["function_name"])

# 为函数"get_source_code"生成一个提示
prompt = fn_explainer.format(function_name=get_source_code)
print(prompt)
Given the function name and source code, generate an English language explanation of the function.
Function Name: get_source_code
Source Code:
def get_source_code(function_name):
# Get the source code of the function
return inspect.getsource(function_name)

Explanation: