序列化模版是指将提示词(prompt)的结构和内容以文件(如 YAML 或 JSON)形式保存下来,便于统一管理、复用和动态加载。这样你可以不用在代码里硬编码模板内容,而是通过读取外部文件,灵活地生成和切换不同的 prompt,提高了项目的可维护性和扩展性。
序列化模版的应用
先编写yaml文件和json文件。
yaml:
_type: prompt
input_variables:
["name", "what"]
template:
请给我汇报下关于{name}的{what}情况。
json:
{
"_type": "prompt",
"input_variables": ["name", "what"],
"template": "请给我汇报下关于{name}的{what}情况。"
}
from langchain.prompts import load_prompt
#load yaml prompt
yaml_prompt = load_prompt("simple_prompt.yaml")
print(yaml_prompt.format(name="小李", what="工作"))
#load json prompt
json_prompt = load_prompt("simple_prompt.json")
print(json_prompt.format(name="小王", what="学习"))
结果:
请给我汇报下关于小李的工作情况。
请给我汇报下关于小王的学习情况。
load_prompt 是 LangChain 提供的一个工具函数,用于从外部文件(如 YAML 或 JSON)加载序列化的提示词模板(prompt)。这样你可以把 prompt 写在文件里,代码中直接加载和复用,方便维护和切换不同的提示词。
优点
- 解耦代码与模板:prompt 独立于代码,便于维护和多人协作。
- 支持多种格式:支持 YAML、JSON 等主流格式。
- 动态加载:可根据需要动态切换不同的 prompt 文件。
加载文件模版并利用正则表达式进行自定义的格式化
json模版:
{
"input_variables": [
"question",
"student_answer"
],
"template": "给出问题: {question}, 学生的回答: {student_answer}, 请用如下格式返回结果:\n\n这里替换为学生的回答\nScore: <score from 0 to 10>",
"template_format": "f-string",
"validate_template": true,
"_type": "prompt"
}
示例代码:
import os
import re
from langchain.prompts import load_prompt
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from dotenv import load_dotenv
load_dotenv() # 自动加载 .env 文件
# 1. 自定义正则解析器
class RegexOutputParser:
def __init__(self, pattern, output_keys):
self.pattern = re.compile(pattern, re.DOTALL)
self.output_keys = output_keys
def parse(self, text):
match = self.pattern.match(text)
if not match:
raise ValueError("Output does not match expected format")
return {k: v.strip() for k, v in zip(self.output_keys, match.groups())}
# 2. 加载 prompt
prompt = load_prompt("prompt_with_output_parser.json")
# 3. 用 prompt 生成模型输入
question = "中国四大发明有哪些?"
student_answer = "中国四大发明是造纸术、指南针、火药和印刷术。"
prompt_text = prompt.format(question=question, student_answer=student_answer)
# print("发送给模型的内容:\n", prompt_text)
# 4. 调用腾讯混元大模型
llm = ChatOpenAI(
api_key=SecretStr(os.environ.get("HUNYUAN_API_KEY", "")),
base_url="https://api.hunyuan.cloud.tencent.com/v1",
model="hunyuan-t1-latest",
temperature=0
)
output_text = llm.invoke(prompt_text)
# print("模型输出:\n", output_text.content)
# 用正则解析模型输出
regex_parser = RegexOutputParser(
pattern=r"(.*?)\nScore: (.*)",
output_keys=["answer", "score"]
)
result = regex_parser.parse(output_text.content)
print("结构化结果:\n", result)
输出:
结构化结果:
{'answer': '中国四大发明是造纸术、指南针、火药和印刷术。', 'score': '10'}
这段代码实现了“用 prompt 生成输入 → 调用大模型 → 用正则解析输出 → 得到结构化结果”的完整流程,适合自动评分、自动批改等场景。其中,prompt 的 template 决定了模型输入格式,正则解析器保证了输出的结构化和可用性。