创建自定义提示模板
假设我们希望LLM根据函数的名称生成英文语言解释。为了实现这个任务,我们将创建一个自定义提示模板,它以函数名称作为输入,并格式化提示模板以提供函数的源代码。为什么需要自定义提示模板?LangChain提供了一组默认的提示模板,可用于生成各种任务的提示。然而,有些情况下默认的提示模板可能不符合您的需求。例如,您可能希望创建一个具有特定动态指令的提示模板。在这种情况下,您可以创建一个自定义的提示模板。请查看当前可用的默认提示模板集合在此处。
创建自定义提示模板
基本上有两种不同的提示模板可用 - 字符串提示模板和聊天提示模板。字符串提示模板提供一个简单的字符串格式提示,而聊天提示模板生成一个更结构化的提示,可用于聊天API。
在本指南中,我们将使用字符串提示模板创建一个自定义提示模板。要创建一个自定义字符串提示模板,有两个要求:
- 它必须具有一个
input_variables属性,用于指定提示模板预期的输入变量。 - 它必须公开一个
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
class FunctionExplainerPromptTemplate(StringPromptTemplate, BaseModel):
"""一个自定义提示模板,它以函数名称作为输入,并格式化提示模板以提供函数的源代码。"""
@validator("input_variables")
def validate_input_variables(cls, v):
"""验证输入变量是否正确。"""
if len(v) != 1 or "function_name" not in v:
raise ValueError("function_name必须是唯一的input_variable。")
return v
def format(self, **kwargs) -> str:
# 获取函数的源代码
source_code = get_source_code(kwargs["function_name"])
# 生成要发送给语言模型的提示
prompt = f"""
给定函数名称和源代码,生成函数的英文语言解释。
函数名称:{kwargs["function_name"].__name__}
源代码:
{source_code}
解释:
"""
return prompt
def _prompt_type(self):
return "function-explainer"
使用自定义提示模板
现在我们已经创建了一个自定义提示模板,我们可以使用它来生成我们任务的提示。
fn_explainer = FunctionExplainerPromptTemplate(input_variables=["function_name"])
# 为函数"get_source_code"生成一个提示
prompt = fn_explainer.format(function_name=get_source_code)
print(prompt)
输出:
给定函数名称和源代码,生成函数的英文语言解释。
函数名称:get_source_code
源代码:
def get_source_code(function_name):
# 获取函数的源代码
return inspect.getsource(function_name)
解释: