【LangChain】Prompts之自定义提示模板

LangChain学习文档


概要

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

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

LangChain提供了一组默认的提示模板,可用于生成各种任务的提示。但是,在某些情况下,默认的提示模板可能无法满足我们的需求。例如,我们可能想要创建一个提示模板,其中包含适合我们的语言模型的特定动态指令。在这种情况下,您可以创建自定义提示模板。

在此处查看当前的默认提示模板集。

创建自定义提示模板(Creating a Custom Prompt Template)

本质上有两种不同的提示模板可用 - 字符串提示模板和聊天提示模板。

一、字符串提示模板提供字符串格式的简单提示。

二、聊天提示模板生成更结构化的提示以与聊天 API 一起使用。

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

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

① 它有一个 input_variables 属性,该属性公开提示模板所需的输入变量。

② 它公开了一个格式方法,该方法接受与预期的 input_variables 相对应的关键字参数并返回格式化的提示。

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

python 复制代码
import inspect


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

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

python 复制代码
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"])

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

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

参考api:

使用自定义提示模板(Use the custom prompt template)

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

python 复制代码
fn_explainer = FunctionExplainerPromptTemplate(input_variables=["function_name"])

# 生成函数"get_source_code"的提示
prompt = fn_explainer.format(function_name=get_source_code)
print(prompt)

结果:

python 复制代码
    给定函数名称和源代码,生成该函数的英语解释。
    函数名称: get_source_code
    源码:
    def get_source_code(function_name):
        # Get the source code of the function
        return inspect.getsource(function_name)
    
    Explanation:
    

总结

本文讲解的就是如何创建自定义提示:

  1. 先定义一个包含变量的字符串,变量用{},如:
python 复制代码
"""\
Given the function name and source code, generate an English language explanation of the function.
Function Name: {function_name}
Source Code:
{source_code}
Explanation:
"""
  1. 使用PROMPT.format(xxx)函数,进行格式化,如:
python 复制代码
prompt = PROMPT.format(
            function_name=kwargs["function_name"].__name__, source_code=source_code
        )

参考地址:

https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/custom_prompt_template

相关推荐
M--Y27 分钟前
LangChain 提示工程:少样本提示与输出解析器
python·langchain·大模型·llm·输出解析器·少样本提示
打工仔折腾 AI1 小时前
极空间用 Docker 部署 Photopea:网页版 PS 的私有化实践
运维·后端·python·docker·容器·langchain·ai agent 实战
大连好光景1 小时前
提示词工程01
prompt·cot·few-shot·提示词工程
for_ever_love__2 小时前
LangChain Agentic RAG:让 Agent 自己决定要不要检索、检索几次
人工智能·golang·langchain·rag·langgraph·agentic·自适应检索
范中勤2 小时前
技术文档:模型工厂 `llm_provider` / `llm_use` 分层设计
设计模式·langchain·架构设计·模型工厂·llm_provider
for_ever_love__3 小时前
LangChain MultiVectorRetriever:一个文档存多个向量
人工智能·python·自然语言处理·langchain·ai大模型·多向量·摘要检索
for_ever_love__3 小时前
LangChain SelfQueryRetriever:让模型自己写过滤条件
人工智能·语言模型·langchain·nlp·全文检索·元数据查询·自查询检索
for_ever_love__4 小时前
LangChain 时间加权检索:让‘最近的事‘更容易被想起
人工智能·语言模型·数据挖掘·langchain·向量·检索·时间加权
范中勤5 小时前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商
for_ever_love__5 小时前
LangChain Text-to-SQL:让不会写 SQL 的人查数据库
数据库·sql·langchain·大模型·agent·rag·问答