当前位置:   article > 正文

【LangChain系列 12】Prompt模版——序列化_langchain用json做prompt

langchain用json做prompt

本文速读:

  • PromptTemplate

  • FewShotPromptTemplate

通常prompt以文件形式存储比python代码更好,一方面可以更容易共享、存储。本文将介绍在LangChain中如何对prompt以不同的方式序列化。

一般来说,对于序列化有以下两个设计原则:

1. 支持JSON和YAML格式。对于prompt,我们希望序列化后是可读的,使用这两种格式,我们可以直接打开文件就可以查看里面的内容;对于其它内容,比如示例可以采用其它序列化方式。

2. 可以将指定内容序列化在一个文件中,比如说将prompt序列化在一个文件,将示例序列化在另一个文件;当然有时候将所有内容序列在同一个文件更合理,所以LangChain对于这两种方式都支持。

01 PromptTemplate


下面介绍三种方式序列化的PromptTemplate是如何加载的:

  • YAML

  • JSON

YAML文件

1. 查看文件内容

cat simple_prompt.yaml

输出内容是:

  1. _type: prompt
  2. input_variables:
  3. ["adjective", "content"]
  4. template:
  5. Tell me a {adjective} joke about {content}.

2. 加载该文件

  1. prompt = load_prompt("simple_prompt.yaml")
  2. print(prompt.format(adjective="funny", content="chickens"))

执行代码,输出结果:

Tell me a funny joke about chickens.

Json文件

1. 查看文件内容

cat simple_prompt.json

输出内容是:

  1. {
  2. "_type": "prompt",
  3. "input_variables": ["adjective", "content"],
  4. "template": "Tell me a {adjective} joke about {content}."
  5. }

2. 加载文件

  1. prompt = load_prompt("simple_prompt.json")
  2. print(prompt.format(adjective="funny", content="chickens")

执行代码,输出结果:

Tell me a funny joke about chickens.

带输出解析器的prompt模版

上面两个示例是简单的PromptTemplate,只包含3个最基本的属性;对于某个prompt模版,它可能还需要一些其它属性,比如说输出解析器。LangChain对这种情况也是支持的。

1. 查看包含输出解析器的配置文件

cat prompt_with_output_parser.json

输出内容:

  1. {
  2. "input_variables": [
  3. "question",
  4. "student_answer"
  5. ],
  6. "output_parser": {
  7. "regex": "(.*?)\\nScore: (.*)",
  8. "output_keys": [
  9. "answer",
  10. "score"
  11. ],
  12. "default_output_key": null,
  13. "_type": "regex_parser"
  14. },
  15. "partial_variables": {},
  16. "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:",
  17. "template_format": "f-string",
  18. "validate_template": true,
  19. "_type": "prompt"
  20. }

​​​2. 加载文件

  1. prompt = load_prompt("prompt_with_output_parser.json")
  2. prompt.output_parser.parse(
  3. "George Washington was born in 1732 and died in 1799.\nScore: 1/2"
  4. )

解析后的内容:

  1. {'answer': 'George Washington was born in 1732 and died in 1799.',
  2. 'score': '1/2'}

prompt模版和配置文件在不同文件

上述两种方式的prompt模版和配置属性都是在同一个文件中,同时也支持两者在不同的文件的情况,模版单独存在一个文件中,配置文件是另一个文件,然后在配置文件中引用它。

1. 查看模版文件内容

cat simple_template.txt

输出内容为:

Tell me a {adjective} joke about {content}.

2. 查看配置文件

cat simple_prompt_with_template_file.json

输出内容为:

  1. {
  2. "_type": "prompt",
  3. "input_variables": ["adjective", "content"],
  4. "template_path": "simple_template.txt"
  5. }

此时配置文件通过template_path指定模版路径。

3. 加载文件​​​​​​​

  1. prompt = load_prompt("simple_prompt_with_template_file.json")
  2. print(prompt.format(adjective="funny", content="chickens"))

执行代码,输出结果:

Tell me a funny joke about chickens.

02 FewShotPromptTemplate


对于FewShotPromptTemplate同样也是可以序列化的 ,它也支持两种文件格式:

  • YAML

  • JSON

下面先准备两种文件格式的样例:

json格式示例:

cat examples.json
  1. [
  2. {"input": "happy", "output": "sad"},
  3. {"input": "tall", "output": "short"}
  4. ]

yaml格式示例:

cat examples.yaml
  1. - input: happy
  2. output: sad
  3. - input: tall
  4. output: short
 

YAML文件

YAML配置文件在一个文件中,样例在另一个文件中(examples.json)。

1. 查看配置文件

cat few_shot_prompt.yaml

输出内容:​​​​​​​

  1. {
  2. "_type": "few_shot",
  3. "input_variables": ["adjective"],
  4. "prefix": "Write antonyms for the following words.",
  5. "example_prompt": {
  6. "_type": "prompt",
  7. "input_variables": ["input", "output"],
  8. "template": "Input: {input}\nOutput: {output}"
  9. },
  10. "examples": "examples.json",
  11. "suffix": "Input: {adjective}\nOutput:"

2. 加载文件​​​​​​​

  1. prompt = load_prompt("few_shot_prompt.json")
  2. print(prompt.format(adjective="funny"))

执行代码,输出结果:​​​​​​​

  1. Write antonyms for the following words.
  2. Input: happy
  3. Output: sad
  4. Input: tall
  5. Output: short
  6. Input: funny
  7. Output:

同样样例文件也可以是examples.yaml。

1. 查看配置文件,样例在另一个文件中(examples.yaml)

cat few_shot_prompt_yaml_examples.yaml

输出内容:

  1. _type: few_shot
  2. input_variables:
  3. ["adjective"]
  4. prefix:
  5. Write antonyms for the following words.
  6. example_prompt:
  7. _type: prompt
  8. input_variables:
  9. ["input", "output"]
  10. template:
  11. "Input: {input}\nOutput: {output}"
  12. examples:
  13. examples.yaml
  14. suffix:
  15. "Input: {adjective}\nOutput:"

2. 加载文件​​​​​​​

  1. prompt = load_prompt("few_shot_prompt_yaml_examples.yaml")
  2. print(prompt.format(adjective="funny"))

执行代码,输出结果:​​​​​​​

  1. Write antonyms for the following words.
  2. Input: happy
  3. Output: sad
  4. Input: tall
  5. Output: short
  6. Input: funny
  7. Output:

JSON文件

JSON配置文件在一个文件中,样例在另一个文件中(examples.json)。 

1. 查看配置文件

cat few_shot_prompt.json

输出内容:​​​​​​​

  1. {
  2. "_type": "few_shot",
  3. "input_variables": ["adjective"],
  4. "prefix": "Write antonyms for the following words.",
  5. "example_prompt": {
  6. "_type": "prompt",
  7. "input_variables": ["input", "output"],
  8. "template": "Input: {input}\nOutput: {output}"
  9. },
  10. "examples": "examples.json",
  11. "suffix": "Input: {adjective}\nOutput:"

3. 加载文件​​​​​​​

  1. prompt = load_prompt("few_shot_prompt.json")
  2. print(prompt.format(adjective="funny"))

执行代码,输出结果:​​​​​​​

  1. Write antonyms for the following words.
  2. Input: happy
  3. Output: sad
  4. Input: tall
  5. Output: short
  6. Input: funny
  7. Output:

同样地,样例文件也可以是examples.yarml。

样例prompt在单独文件中

上面的例子,样例prompt (example_prompt属性)直接写在配置文件中,但是有时候 样例prompt 可能在单独的文件中,对于这种情况,LangChain也是支持的,只需要把example_prompt换成example_prompt_path即可。

1. 查看样例prompt

cat example_prompt.json

输出内容:​​​​​​​

  1. {
  2. "_type": "prompt",
  3. "input_variables": ["input", "output"],
  4. "template": "Input: {input}\nOutput: {output}"
  5. }

2. 查看配置文件

cat few_shot_prompt_example_prompt.json

输出内容:​​​​​​​

  1. {
  2. "_type": "few_shot",
  3. "input_variables": ["adjective"],
  4. "prefix": "Write antonyms for the following words.",
  5. "example_prompt_path": "example_prompt.json",
  6. "examples": "examples.json",
  7. "suffix": "Input: {adjective}\nOutput:"
  8. }

3. 加载文件​​​​​​​

  1. prompt = load_prompt("few_shot_prompt_example_prompt.json")
  2. print(prompt.format(adjective="funny"))

执行代码,输出结果:

  1. Write antonyms for the following words.
  2. Input: happy
  3. Output: sad
  4. Input: tall
  5. Output: short
  6. Input: funny
  7. Output:

样例和配置文件在同一个文件

上述介绍的方式中,样例都是单独的一个文件,和配置文件是分开的。LangChain同时也支持样例和配置在同一个文件中。

1. 查看文件

cat few_shot_prompt_examples_in.json

输出内容:​​​​​​​

  1. {
  2. "_type": "few_shot",
  3. "input_variables": ["adjective"],
  4. "prefix": "Write antonyms for the following words.",
  5. "example_prompt": {
  6. "_type": "prompt",
  7. "input_variables": ["input", "output"],
  8. "template": "Input: {input}\nOutput: {output}"
  9. },
  10. "examples": [
  11. {"input": "happy", "output": "sad"},
  12. {"input": "tall", "output": "short"}
  13. ],
  14. "suffix": "Input: {adjective}\nOutput:"
  15. }

2. 加载文件​​​​​​​

  1. prompt = load_prompt("few_shot_prompt_examples_in.json")
  2. print(prompt.format(adjective="funny"))

执行代码,输出结果:​​​​​​​

  1. Write antonyms for the following words.
  2. Input: happy
  3. Output: sad
  4. Input: tall
  5. Output: short
  6. Input: funny
  7. Output:

本文小结

本文主要介绍了PromptTemplate和FewShotPromptTempalte两种模版的序列化,它们都支持JSON、YAML两种格式;同时对于 示例和示例prompt,既可以包含在配置文件中,也可以在独立的一个文件中。

公众号:大白爱爬山

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/1000812
推荐阅读
相关标签
  

闽ICP备14008679号