自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:序列化提示信息]

分类目录:《自然语言处理从入门到应用》总目录


将提示信息存储为文件而不是Python代码通常更好。这样可以方便共享、存储和版本控制提示信息。本文介绍了如何在LangChain中进行提示信息的序列化,包括不同类型的提示信息和不同的序列化选项。

在高层次上,序列化遵循以下设计原则:

  • 支持JSON和YAML。LangChain希望支持在磁盘上易于阅读的序列化方法,而YAML和JSON是其中两种最受欢迎的方法。需要注意的是,此规则适用于提示信息。对于其他内容(例如示例),可能支持不同的序列化方法。
  • LangChain支持在一个文件中指定所有内容,或者将不同的组件(模板、示例等)存储在不同的文件中并进行引用。对于某些情况,将所有内容存储在一个文件中可能是最合适的,但对于其他情况,将某些内容拆分开(长模板、大型示例、可重用组件)可能更好。而LangChain同时支持这两种方式。

LangChain还提供了一个单一的入口点,用于从磁盘加载提示信息,从而轻松加载任何类型的提示信息。

dart 复制代码
# All prompts are loaded through the `load_prompt` function.
from langchain.prompts import load_prompt

PromptTemplate

本部分介绍了加载PromptTemplate

从YAML加载

下面是从YAML加载PromptTemplate的示例:

本地文件:

复制代码
!cat simple_prompt.yaml
    _type: prompt
    input_variables:
        ["adjective", "content"]
    template: 
        Tell me a {adjective} joke about {content}.

输入:

复制代码
prompt = load_prompt("simple_prompt.yaml")
print(prompt.format(adjective="funny", content="chickens"))

输出:

复制代码
Tell me a funny joke about chickens.
从JSON加载

下面是从JSON加载PromptTemplate的示例:

本地文件:

复制代码
!cat simple_prompt.json
    {
        "_type": "prompt",
        "input_variables": ["adjective", "content"],
        "template": "Tell me a {adjective} joke about {content}."
    }

输入:

复制代码
prompt = load_prompt("simple_prompt.json")
print(prompt.format(adjective="funny", content="chickens"))

输出:

复制代码
Tell me a funny joke about chickens.
从文件加载

下面是将模板存储在单独文件中,并在配置中引用该文件的示例。需要注意的是,键从template更改为template_path

本地文件:

复制代码
!cat simple_template.txt
Tell me a {adjective} joke about {content}.

!cat simple_prompt_with_template_file.json
    {
        "_type": "prompt",
        "input_variables": ["adjective", "content"],
        "template_path": "simple_template.txt"
    }

输入:

复制代码
prompt = load_prompt("simple_prompt_with_template_file.json")
print(prompt.format(adjective="funny", content="chickens"))

输出:

复制代码
Tell me a funny joke about chickens.

FewShotPromptTemplate

本部分介绍加载FewShotPromptTemplate的示例。下面是SON本地文件的示例:

本地文件:

复制代码
!cat examples.json
    [
        {"input": "happy", "output": "sad"},
        {"input": "tall", "output": "short"}
    ]

以下是将相同示例存储为YAML格式的示例:

复制代码
!cat examples.yaml
    - input: happy
      output: sad
    - input: tall
      output: short
从YAML加载

这是一个从YAML加载Few-Shot Example的示例。

本地文件:

复制代码
!cat few_shot_prompt.yaml
    _type: few_shot
    input_variables:
        ["adjective"]
    prefix: 
        Write antonyms for the following words.
    example_prompt:
        _type: prompt
        input_variables:
            ["input", "output"]
        template:
            "Input: {input}\nOutput: {output}"
    examples:
        examples.json
    suffix:
        "Input: {adjective}\nOutput:"

输入:

复制代码
prompt = load_prompt("few_shot_prompt.yaml")
print(prompt.format(adjective="funny"))

输出:

复制代码
    Write antonyms for the following words.
    
    Input: happy
    Output: sad
    
    Input: tall
    Output: short
    
    Input: funny
    Output:

如果我们从YAML文件中加载示例,同样的方法也适用。

本地文件:

复制代码
!cat few_shot_prompt_yaml_examples.yaml
    _type: few_shot
    input_variables:
        ["adjective"]
    prefix: 
        Write antonyms for the following words.
    example_prompt:
        _type: prompt
        input_variables:
            ["input", "output"]
        template:
            "Input: {input}\nOutput: {output}"
    examples:
        examples.yaml
    suffix:
        "Input: {adjective}\nOutput:"

输入:

复制代码
prompt = load_prompt("few_shot_prompt_yaml_examples.yaml")
print(prompt.format(adjective="funny"))
    Write antonyms for the following words.

输出:

复制代码
    Input: happy
    Output: sad
    
    Input: tall
    Output: short
    
    Input: funny
    Output:
从JSON加载

这是一个从JSON加载Few-Shot Example的示例。

本地文件:

复制代码
!cat few_shot_prompt.json
    {
        "_type": "few_shot",
        "input_variables": ["adjective"],
        "prefix": "Write antonyms for the following words.",
        "example_prompt": {
            "_type": "prompt",
            "input_variables": ["input", "output"],
            "template": "Input: {input}\nOutput: {output}"
        },
        "examples": "examples.json",
        "suffix": "Input: {adjective}\nOutput:"
    }   

输入:

复制代码
prompt = load_prompt("few_shot_prompt.json")
print(prompt.format(adjective="funny"))

输出:

复制代码
    Write antonyms for the following words.
    
    Input: happy
    Output: sad
    
    Input: tall
    Output: short
    
    Input: funny
    Output:
配置中的示例

这是一个直接在配置中引用示例的示例。

本地文件:

复制代码
!cat few_shot_prompt_examples_in.json
    {
        "_type": "few_shot",
        "input_variables": ["adjective"],
        "prefix": "Write antonyms for the following words.",
        "example_prompt": {
            "_type": "prompt",
            "input_variables": ["input", "output"],
            "template": "Input: {input}\nOutput: {output}"
        },
        "examples": [
            {"input": "happy", "output": "sad"},
            {"input": "tall", "output": "short"}
        ],
        "suffix": "Input: {adjective}\nOutput:"
    } 

输入:

复制代码
prompt = load_prompt("few_shot_prompt_examples_in.json")
print(prompt.format(adjective="funny"))

输出:

复制代码
    Write antonyms for the following words.
    
    Input: happy
    Output: sad
    
    Input: tall
    Output: short
    
    Input: funny
    Output:
从文件加载示例提示

这是一个从单独的文件加载用于格式化示例的PromptTemplate的示例。需要注意的是,键名从example_prompt更改为example_prompt_path

本地文件:

复制代码
!cat example_prompt.json
    {
        "_type": "prompt",
        "input_variables": ["input", "output"],
        "template": "Input: {input}\nOutput: {output}" 
    }
!cat few_shot_prompt_example_prompt.json 
    {
        "_type": "few_shot",
        "input_variables": ["adjective"],
        "prefix": "Write antonyms for the following words.",
        "example_prompt_path": "example_prompt.json",
        "examples": "examples.json",
        "suffix": "Input: {adjective}\nOutput:"
    }   

输入:

复制代码
prompt = load_prompt("few_shot_prompt_example_prompt.json")
print(prompt.format(adjective="funny"))

输出:

复制代码
    Write antonyms for the following words.
    
    Input: happy
    Output: sad
    
    Input: tall
    Output: short
    
    Input: funny
    Output:

带有OutputParser的PromptTemplate

这是一个从文件加载PromptTemplateOutputParser的示例。

本地文件:

复制代码
! cat prompt_with_output_parser.json
    {
        "input_variables": [
            "question",
            "student_answer"
        ],
        "output_parser": {
            "regex": "(.*?)\\nScore: (.*)",
            "output_keys": [
                "answer",
                "score"
            ],
            "default_output_key": null,
            "_type": "regex_parser"
        },
        "partial_variables": {},
        "template": "Given the following question and student answer, provide a correct answer and score the student answer.\nQuestion: {question}\nStudent Answer: {student_answer}\nCorrect Answer:",
        "template_format": "f-string",
        "validate_template": true,
        "_type": "prompt"
    }

输入:

复制代码
prompt = load_prompt("prompt_with_output_parser.json")
prompt.output_parser.parse("George Washington was born in 1732 and died in 1799.\nScore: 1/2")
    {'answer': 'George Washington was born in 1732 and died in 1799.',
     'score': '1/2'}

参考文献:

1\] LangChain官方网站:https://www.langchain.com/ \[2\] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/ \[3\] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/

相关推荐
绝世这天下2 小时前
【在 DGX Spark 上运行 vLLM-Omni 用于 Qwen3-TTS(语音设计,语音克隆)】
人工智能
陈大鱼头3 小时前
[译]费尽心思来保障 OpenClaw ?那跟直接用 GPT 有什么区别?
人工智能
Fleshy数模3 小时前
玩转OpenCV:视频椒盐噪声处理与图像形态学操作实战
人工智能·opencv·音视频
幂律智能3 小时前
Agent × 流程引擎融合架构:从静态流程到智能流程编排
人工智能·架构·agent
无垠的广袤3 小时前
ChatECNU 大语言模型与 PicoClaw 部署
人工智能·语言模型·自然语言处理·嵌入式·树莓派
爱淋雨的男人3 小时前
自动驾驶感知相关算法
人工智能·算法·自动驾驶
互联网科技看点3 小时前
AI算力爆发叠加数据资产风口,铂拉锐科技布局去中心化数字生态
人工智能·科技·去中心化
如若1233 小时前
flash-attn 安装失败?从报错到成功的完整排雷指南(CUDA 12.8 + PyTorch 2.7)
人工智能·pytorch·python
七牛云行业应用3 小时前
GPT-5.4能力前瞻:解析原生电脑操控(Computer Use)原理与Agent架构构建
人工智能·chatgpt·大语言模型·ai agent·mcp协议
带娃的IT创业者3 小时前
Prompt Engineering 进阶:让 AI 写出人类味道(完整指南)
人工智能·大模型·llm·prompt·写作技巧·ai 教学