AI Agent开发学习系列 - 使用序列化模版生成prompt

序列化模版是指将提示词(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 决定了模型输入格式,正则解析器保证了输出的结构化和可用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值