提示词工程教程(三):约束和引导生成

概述

本教程探讨了大型语言模型背景下的约束和引导生成的概念。我们将重点介绍设置模型输出约束的技术,以及使用 OpenAI 的 GPT 模型和 LangChain 库实现基于规则的生成。

目标

虽然大型语言模型是生成文本的强大工具,但它们有时会产生过于开放或缺乏特定期望特征的输出。约束和引导生成技术使我们能够更好地控制模型的输出,使其更适合特定任务或遵守某些规则和格式。

内容概要

1. 设置模型输出约束 2. 实现基于规则的生成 3. 使用 LangChain 的 PromptTemplate 进行结构化提示 4. 利用 OpenAI 的 GPT 模型进行文本生成

实施方案

我们将结合快速工程技术和 LangChain 实用程序来实现约束和引导生成:
  1. 我们将首先设置环境并导入必要的库。
  2. 我们将使用 LangChain 的 PromptTemplate 创建结构化提示来指导模型的输出。
  3. 我们将通过在提示中指定规则和格式来实现约束。
  4. 我们将使用 OpenAI 的 GPT 模型根据我们的约束提示生成文本。
  5. 我们将探索基于规则生成的不同技术,包括输出解析和基于正则表达式的验证。

总结

在本教程结束时,您将对如何实施约束和引导生成技术有深入的理解。这些技能将使您能够从大型语言模型中创建更受控制和更具体的输出,使其更适合需要精确且符合规则的文本生成的各种应用。

设置

首先,让我们导入必要的库并设置我们的环境。
import os
import re

from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.output_parsers import RegexParser

from dotenv import load_dotenv
load_dotenv()

# Set up the OpenAI API key
os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY')

# Initialize the language model
llm = ChatOpenAI(model="gpt-4o-mini")

# Function to display model outputs
def display_output(output):
    """Display the model's output in a formatted manner."""
    print("Model Output:")
    print("-" * 40)
    print(output)
    print("-" * 40)
    print()

设置模型输出约束

让我们首先创建一个受限提示,生成具有特定要求的产品描述。
constrained_prompt = PromptTemplate(
    input_variables=["product", "target_audience", "tone", "word_limit"],
    template="""为 {product} 创建针对 {target_audience} 的产品描述。
    使用 {tone} 语气,字数控制在 {word_limit} 字以内。
    描述应包括:
    1. 吸引人的标题
    2. 三个主要功能
    3. 号召性用语
    
    产品描述:
    """
)

# Generate the constrained output
input_variables = {
    "product": "智能水瓶",
    "target_audience": "注重健康的千禧一代",
    "tone": "随意而友好",
    "word_limit": "75"
}

chain = constrained_prompt | llm
output = chain.invoke(input_variables).content
display_output(output)
模型输出:
----------------------------------------------------
**保持水分,保持棒极了!**  

认识您的新补水伙伴!我们的智能水瓶可跟踪您的饮水量,提醒您全天喝水,并与您最喜欢的健身应用程序同步。它采用环保材料制成,专为忙碌的生活方式而设计,是注重健康的千禧一代的完美配件。准备好提升您的补水能力了吗?今天就买一个,喝出好心情吧!
----------------------------------------------------

实现基于规则的生成

现在,让我们实现一个基于规则的生成系统,用于创建结构化的招聘信息。
job_posting_prompt = PromptTemplate(
    input_variables=["job_title", "company", "location", "experience"],
    template="""在 {location} 的 {company} 创建 {job_title} 职位的招聘信息。
    应聘者应具有 {experience} 年的工作经验。
    遵循以下规则:
    1. 以简短的公司描述开头(2 句话)
    2. 列出 5 项关键职责,每项都以动作动词开头
    3. 列出 5 项必备资格,每项都用一句话写出
    4. 以标准化的平等机会声明结尾
    
    按以下格式设置输出:
    公司:[公司描述]
    
    职责:
    - [职责 1]
    - [职责 2]
    - [职责 3]
    - [职责 4]
    - [职责 5]
    
    资格:
    - [资格 1]
    - [资格 2]
    - [资格 3]
    - [资格 4]
    - [资格 5]
    EEO:[平等机会声明]
    """
)

# Generate the rule-based output
input_variables = {
    "job_title": "高级软件工程师",
    "company": "BAT",
    "location": "上海市",
    "experience": "5+"
}

chain = job_posting_prompt | llm
output = chain.invoke(input_variables).content
display_output(output)

模型输出:

公司:BAT 是一家具有前瞻性思维的技术公司,致力于开发尖端软件解决方案,帮助全球企业取得成功。公司位于上海市中心,我们以营造协作和创新的工作环境而自豪。

职责:

  • 设计和实施强大的软件架构来支持可扩展的应用程序。
  • 领导跨职能团队开发和部署新功能和增强功能。
  • 与产品经理合作,定义并确定产品需求的优先顺序。
  • 指导初级工程师并提供最佳编码实践和方法的指导。
  • 进行代码审查并确保遵守行业标准和质量保证流程。

资格:

  • 至少需要5年的专业软件工程经验。
  • 必须熟练掌握 Java、Python 或 JavaScript 等编程语言。
  • 深入了解软件开发方法,包括 Agile 和 DevOps 实践。
  • 具有 AWS、Azure 或 Google Cloud 等云平台经验者优先。
  • 必须具备出色的解决问题的能力和在团队环境中有效工作的能力。

平等就业机会:BAT 是一家提供平等就业机会的雇主。我们崇尚多元化,并致力于为所有员工创造一个包容的环境。

使用正则表达式解析器进行结构化输出

让我们使用正则表达式解析器来确保我们的输出符合特定的结构
# Define a regex parser for structured output
regex_parser = RegexParser(
    regex=r"COMPANY:\s*([\s\S]*?)\n\s*RESPONSIBILITIES:\s*([\s\S]*?)\n\s*QUALIFICATIONS:\s*([\s\S]*?)\n\s*EEO:\s*([\s\S]*)",
    output_keys=["company_description", "responsibilities", "qualifications", "eeo_statement"]
)
# This regex pattern captures the company description, responsibilities, qualifications, and EEO statement from the output text.

# Create a new prompt template that includes the parser instructions
parsed_job_posting_prompt = PromptTemplate(
    input_variables=["job_title", "company", "location", "experience"],
    template="""在 {location} 的 {company} 创建 {job_title} 职位的招聘信息。
    应聘者应具有 {experience} 年经验。
    遵循以下规则:
    1. 以简短的公司描述开头(2 句话)
    2. 列出 5 项关键职责,每项都以动作动词开头
    3. 列出 5 项必备资格,每项都用一句话写出
    4. 以标准化的平等机会声明结尾
    
    输出格式应完全按照以下格式:
    公司:[公司描述]
    
    职责:
    - [职责 1]
    - [职责 2]
    - [职责 3]
    - [职责 4]
    - [职责 5]
    
    资格:
    - [资格 1]
    - [资格 2]
    - [资格 3]
    - [资格 4]
    - [资格 5]
    
    EEO:[平等机会声明]
    """
)

def clean_output(output):
    for key, value in output.items():
        if isinstance(value, str):
            # Remove leading/trailing whitespace and normalize newlines
            output[key] = re.sub(r'\n\s*', '\n', value.strip())
    return output

# Generate the parsed output
chain = parsed_job_posting_prompt | llm
raw_output = chain.invoke(input_variables).content

# Parse and clean the output
parsed_output = regex_parser.parse(raw_output)
cleaned_output = clean_output(parsed_output)

# Display the parsed output
print("正则表达式解析输出:")
for key, value in cleaned_output.items():
    print(f"{key.upper()}:")
    print(value)
    print()

正则表达式解析的输出:
公司描述:
BAT 是一家总部位于上海市的领先技术公司,致力于打造尖端软件解决方案,帮助企业在数字时代蓬勃发展。我们的团队由富有创新精神的思想家和问题解决者组成,致力于突破技术界限,提供卓越的产品和服务。

职责:

  • 设计和开发满足客户需求的可扩展软件应用程序。
  • 与跨职能团队合作定义、设计和实施新功能。
  • 指导初级工程师,为他们的职业成长提供指导和支持。
  • 及时排除故障并解决软件缺陷和性能问题。
  • 随时了解新兴技术和行业趋势,以确保最佳实践。

资格:

  • 至少 5 年软件开发经验,重点关注全栈技术。
  • 精通 Java、Python 或 JavaScript 等编程语言以及相关框架。
  • 具有 AWS、Azure 或 Google Cloud 等云平台经验。
  • 深入了解软件开发生命周期 (SDLC) 和敏捷方法。
  • 出色的解决问题能力和在快节奏环境中工作的能力。

EEO_声明:
BAT 是一家提供平等就业机会的雇主。我们崇尚多元化,并致力于为所有员工创造一个包容的环境。

实施附加约束

让我们创建一个更复杂的约束生成任务:生成具有特定标准的产品评论。
review_prompt = PromptTemplate(
    input_variables=["product", "rating", "pros", "cons", "word_limit"],
    template="""为 {product} 撰写产品评论,并遵循以下限制:
    1. 评论应获得 {rating} 星评级(满分 5 星)
    2. 准确包含 {pros} 个优点和 {cons} 个缺点
    3. 每个优点和缺点使用 2 到 3 个句子
    4. 整个评论应少于 {word_limit} 个字
    5. 以一句话推荐结尾
    
    评论格式如下:
    评级:[X] 星(满分 5 星)
    
    优点:
    1. [优点 1]
    2. [优点 2]
    ...
    
    缺点:
    1. [缺点 1]
    2. [缺点 2]
    ...
    
    推荐:[一句话推荐]
    """
)
# Generate the constrained review
input_variables = {
    "product": "Smartphone X",
    "rating": "4",
    "pros": "3",
    "cons": "2",
    "word_limit": "200"
}

chain = review_prompt | llm
output = chain.invoke(input_variables).content
display_output(output)

模型输出:

评分:4星(满分5星)

优点:

  1. Smartphone X 的相机质量非常出色,即使在弱光环境下也能捕捉到鲜艳的色彩和清晰的细节。多种镜头选项为不同的摄影风格提供了多功能性,使其成为普通用户和摄影爱好者的绝佳选择。
  2. 电池续航时间令人印象深刻,即使大量使用也能维持一整天。快速充电功能可确保您可以立即恢复使用手机,这对于忙碌的人来说是一个巨大的优势。
  3. 流畅的设计和轻巧的构造让 Smartphone X 握持舒适,一整天使用都十分方便。其高端的手感和现代美学也使其外观极具吸引力。

缺点:

  1. 虽然性能总体上很流畅,但在运行资源密集型应用程序时偶尔会出现延迟。对于严重依赖设备提高工作效率的用户来说,这可能是一个缺点。
  2. 对于那些需要额外空间来存放应用程序、照片和视频的人来说,缺乏可扩展的存储空间是一个限制。因此,用户可能会发现自己需要更频繁地管理存储空间。

建议:总体而言,对于寻求功能强大且时尚的设备的人来说,Smartphone X 是一个绝佳的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值