Langchain文档 创建自定义提示模板

412 阅读3分钟

创建自定义提示模板

假设我们希望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

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)

解释: