提示词工程教程:提示词模板和变量教程(使用 Jinja2)

概述

本教程全面介绍了如何在 AI 语言模型中创建和使用带有变量的提示模板。它重点介绍如何利用 Python 和 Jinja2 模板引擎创建灵活、可重复使用的提示结构,这些结构可以包含动态内容。本教程演示了如何使用这些高级提示技术与 OpenAI 的 GPT 模型进行交互。

主题

随着 AI 语言模型变得越来越复杂,编写有效提示的能力对于获得所需输出至关重要。提示模板和变量具有以下几个优点:
  1. 可重用性:模板可以在不同的环境中重复使用,从而节省时间并确保一致性。
  2. 灵活性:变量允许动态内容插入,使提示适应各种场景。
  3. 复杂性管理:模板可以处理复杂的结构,包括条件逻辑和循环,从而实现与 AI 模型更复杂的交互。
  4. 可扩展性:随着应用程序的增长,结构良好的模板可以更轻松地管理和维护大量提示。

本教程旨在让学习者掌握创建强大、灵活的提示模板的知识和技能,增强他们有效使用 AI 语言模型的能力。

内容概要

本教程涵盖几个关键部分:

  1. PromptTemplate 类:包装 Jinja2 的 Template 类的自定义类,为创建和使用模板提供了简单的接口。
  2. Jinja2 模板:利用 Jinja2 实现高级模板功能,包括变量插入、条件语句和循环。
  3. OpenAI API 集成:直接使用 OpenAI API 发送提示并接收 GPT 模型的响应。
  4. 变量处理:将变量合并到模板中并管理动态内容的技术。
  5. 条件逻辑:在模板内实现 if-else 语句以创建上下文感知提示。
  6. 高级格式:构建复杂提示的方法,包括列表格式和多部分指令。

教案

本教程采用循序渐进的方式来介绍和演示提示模板概念:
  1. 设置和环境:课程首先设置必要的库,包括 Jinja2 和 OpenAI API 客户端。
  2. 基本模板创建:介绍使用自定义 PromptTemplate 类创建具有单个和多个变量的简单模板。
  3. 变量插入:演示如何使用 Jinja2 的{{ variable }}语法将变量插入模板。
  4. 条件内容:探索在模板中使用 if-else 语句来创建根据提供的变量进行调整的提示。
  5. 列表处理:处理模板内项目列表的技术,包括迭代和格式化。
  6. 高级模板:更复杂的模板结构的演示,包括嵌套条件、循环和多部分提示。
  7. 动态指令生成:创建可以根据多个输入变量生成结构化指令的模板。
  8. API 集成:在整个教程中,示例展示了如何使用模板和 OpenAI API 从 GPT 模型生成响应。

这些方法通过实际示例呈现,从简单到复杂的用例逐步推进。每个概念都从理论上进行解释,然后通过实际应用进行演示。

结论

本教程为创建和使用带有变量的提示模板奠定了坚实的基础,并利用 Jinja2 的强大功能实现高级模板功能。在课程结束时,学习者将获得:
  1. 了解提示模板在AI交互中的重要性和应用。
  2. 创建可重复使用、灵活的提示模板的实用技能。
  3. 了解如何将变量和条件逻辑合并到提示中。
  4. 具有针对各种用例构建复杂提示的经验。
  5. 深入了解模板提示与 OpenAI API 的集成。

这些技能可以实现与 AI 语言模型的更复杂、更高效的交互,为创建更高级、情境感知的 AI 应用程序开辟了可能性。所学技术可以应用于各种场景,从简单的查询系统到复杂的多轮对话代理。

设置

```python import os import openai from jinja2 import Template from dotenv import load_dotenv

load_dotenv()

openai.api_key = os.getenv(‘OPENAI_API_KEY’)

def get_completion(prompt, model=“gpt-4o-mini”):
‘’’ 从 OpenAI API 获取完成
Args:
prompt (str):发送给 API 的提示
model (str):用于完成的模型
Returns:
str:完成文本
‘’’
messages = [{“role”: “user”, “content”: prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0,
)
return response.choices[0].message[“content”]


<h2 id="1.-Creating-Reusable-Prompt-Templates"><font style="color:rgba(0, 0, 0, 0.87);">1. 创建可重复使用的提示模板</font></h2>
<font style="color:rgba(0, 0, 0, 0.87);">我们将创建一个使用 Jinja2 进行模板化的 PromptTemplate 类:</font>

```python
class PromptTemplate:
    ''' 用于表示生成带有变量的提示的模板的类
    属性:
        template (str): 带有变量的模板字符串
        input_variables (list): 模板中变量名称的列表
    '''
    def __init__(self, template, input_variables):
        self.template = Template(template)
        self.input_variables = input_variables
    
    def format(self, **kwargs):
        return self.template.render(**kwargs)

# 带有一个变量的简单模板
simple_template = PromptTemplate(
    template="提供 {{ topic }} 的简要说明。",
    input_variables=["topic"]
)

# 具有多个变量的更复杂的模板
complex_template = PromptTemplate(
    template="向 {{audience}} 受众简明扼要地解释 {{field}} 字段中 {{concept}} 的概念",
    input_variables=["concept", "field", "audience"]
)

# 使用简单模板
print("简单模板结果:")
prompt = simple_template.format(topic="光合作用")
print(get_completion(prompt))

print("\n" + "-"*50 + "\n")

# Using the complex template
print("复杂模板结果:")
prompt = complex_template.format(
    concept="神经网络",
    field="人工智能",
    audience="初学者"
)
print(get_completion(prompt))
简单模板结果:
光合作用是绿色植物、藻类和一些细菌将光能(通常来自太阳)转化为储存在葡萄糖中的化学能的过程。该过程主要发生在植物细胞的叶绿体中,叶绿素(绿色色素)在其中捕获光能。

在光合作用过程中,大气中的二氧化碳 (CO₂) 和土壤中的水 (H₂O) 被用于产生葡萄糖 (C₆H₁₂O₆) 和氧气 (O₂)。光合作用的总化学方程式可以概括为:

6 CO₂ + 6 H₂O + 光能 → C₆H₁₂O₆ + 6 O₂

光合作用对于地球上的生命至关重要,因为它提供我们呼吸的氧气,并通过产生作为其他生物能量来源的有机化合物作为食物链的基础。

--------------------------------------------------

复杂模板结果:
神经网络是人工智能的一项关键技术,它模仿人类大脑处理信息的方式。它们由多层相互连接的节点或“神经元”组成,这些节点或神经元共同识别模式并做出决策。

以下是一个简单的细分:

1. **结构**:神经网络有一个输入层(数据输入的地方)、一个或多个隐藏层(进行处理的地方)和一个输出层(输出结果的地方)。

2. **学习**:神经网络通过根据错误调整神经元之间的连接(权重)来从数据中学习。这个过程称为训练。

3. **功能**:经过训练后,神经网络可以执行图像识别、语言翻译等任务,甚至根据新的输入数据预测结果来玩游戏。

本质上,神经网络是一种强大的工具,可以帮助计算机从经验中学习,类似于人类从周围环境中学习。

2. 使用变量来传递动态内容

现在让我们探索变量的更多高级用法,包括条件内容:
# Template with conditional content
conditional_template = PromptTemplate(
    template="我的名字是 {{ name }},我今年 {{ age }} 岁。" 
              "{ % if professional %}我的工作是 {{ professional }}。{ % else %}我目前没有工作。{ % endif %}" 
              "您能根据这些信息给我一些职业建议吗?请简明扼要地回答。",
    input_variables=["name", "age", "profession"]
)

# Using the conditional template
print("条件模板结果(含职业):")
prompt = conditional_template.format(
    name="Alex",
    age="28",
    profession="软件开发人员"
)
print(get_completion(prompt))

print("\n条件模板结果(不含职业):")
prompt = conditional_template.format(
    name="Sam",
    age="22",
    profession=""
)
print(get_completion(prompt))

print("\n" + "-"*50 + "\n")
条件模板结果(含职业):
当然可以,Alex!以下是一些针对软件开发人员的职业建议:

1. **持续学习**:随时掌握最新技术和编程语言。考虑参加云计算、人工智能或网络安全等领域的在线课程或认证。

2. **社交**:参加行业聚会、会议和在线论坛,与其他专业人士建立联系。这可以带来工作机会和合作。

3. **建立作品集**:从事个人或开源项目来展示你的技能。优秀的作品集可以让你在求职中脱颖而出。

4. **软技能**:培养沟通和团队合作能力。在软件开发中,有效协作的能力至关重要。

5. **探索专业化**:考虑专攻某个细分领域(例如移动开发、数据科学或 DevOps)以增强您的市场竞争力。

6. **寻求反馈**:定期向同行和导师寻求反馈,以提高您的编码和解决问题的能力。

7. **工作与生活的平衡**:优先考虑你的健康以避免倦怠。平衡的生活可以提高你的生产力和创造力。

祝你事业有成!

条件模板结果(不含职业):
当然可以,Sam!您可以采取以下措施:

1. **自我评估**:确定你的技能、兴趣和价值观。考虑一下你喜欢做什么以及你擅长什么。

2. **探索选项**:研究符合你兴趣的不同职业道路。研究正在发展且有就业机会的行业。

3. **教育与培训**:考虑进一步的教育或认证,以提高你的技能。在线课程可以是一个灵活的选择。

4. **人际网络**:通过 LinkedIn、当地聚会或行业活动与您感兴趣领域的专业人士建立联系。信息采访可以提供有价值的见解。

5. **实习/志愿服务**:通过实习或志愿工作获得经验。这可以帮助你丰富简历并建立人脉。

6. **求职**:开始申请入门级职位或您感兴趣的职位。针对每份申请量身定制您的简历和求职信。

7. **保持积极**:找工作可能很有挑战性,但要坚持不懈并对机会持开放态度。

祝你好运!

--------------------------------------------------
# 列表处理的模板
list_template = PromptTemplate(
    template="将这些项目分类到组中:{{ items }}。提供类别以及每个类别中的项目。",
    input_variables=["items"]
)

# 使用列表模板
print("列表模板结果:")
prompt = list_template.format(
    items="苹果, 香蕉, 胡萝卜, 锤子, 螺丝刀, 钳子, 小说, 教科书, 杂志"
)
print(get_completion(prompt))
列表模板结果:
以下是您提供的项目的分类组:

### 水果
- 苹果
- 香蕉

### 蔬菜
- 胡萝卜

### 工具
- 锤子
- 螺丝刀
- 钳子

### 文学
- 小说
- 教科书
- 杂志

高级模板技术

让我们探索一些使用提示模板和变量的更高级的技术:
# 带有格式化列表的模板
list_format_template = PromptTemplate(
    template="分析以下项目列表:\n " 
              "{ % f or item in items.split(',') %}" 
              "- {{ item.strip() }} \n " 
              "{ % e ndfor %}" 
              " \n提供列表摘要并建议任何模式或分组。",
    input_variables=["items"]
)


# 使用格式化列表模板
print("格式化列表模板结果:")
prompt = list_format_template.format(
    items="Python, JavaScript, HTML, CSS, React, Django, Flask, Node.js"
)
print(get_completion(prompt))

print("\n" + "-"*50 + "\n")
格式化列表模板结果:
您提供的项目列表包括 Web 开发中常用的编程语言、框架和技术。以下是这些项目的摘要和分析:

### 列表摘要:
1. **编程语言:**
   - **Python**:一种多功能的高级编程语言,以其可读性和广泛的应用范围而闻名,包括 Web 开发、数据分析、人工智能等。
   - **JavaScript**:实现交互式网页的核心 Web 技术,是前端开发必不可少的。它也可以与 Node.js 等环境一起在服务器端使用。

2. **标记和样式语言:**
   - **HTML(超文本标记语言)**:创建网页的标准标记语言。它构建网络上的内容。
   - **CSS(层叠样式表)**:一种用于描述以 HTML 编写的文档呈现方式的样式表语言。它控制布局、颜色、字体和整体视觉美感。

3. **框架和库:**
   - **React**:用于构建用户界面(尤其是单页应用程序)的 JavaScript 库。它允许开发人员创建可重复使用的 UI 组件。
   - **Django**:一个高级 Python Web 框架,鼓励快速开发和简洁、实用的设计。它遵循“内置电池”理念,提供许多内置功能。
   - **Flask**:一个轻量级的 Python Web 框架,易于使用且灵活,适用于中小型应用程序。
   - **Node.js**:基于 Chrome V8 引擎构建的 JavaScript 运行时,允许开发人员在服务器端执行 JavaScript。它通常用于构建可扩展的网络应用程序。

### 模式和分组:
1. **Web 开发重点**:所有项目都与 Web 开发相关,要么是用于构建 Web 应用程序的语言(Python、JavaScript),要么是用于构建(HTML)和设计(CSS)Web 内容的技术。

2. **前端与后端**:
   - **前端技术**:JavaScript、HTML、CSS 和 React 主要用于客户端开发,注重用户界面和用户体验。
   - **后端技术**:Python(包括 Django 和 Flask)和 Node.js 用于服务器端开发、处理业务逻辑、数据库交互和服务器管理。

3. **语言和框架关系**:
   - **Python 框架**:Django 和 Flask 都是使用 Python 的框架,展示了其在 Web 开发中的多功能性。
   - **JavaScript 框架**:React 是一个增强 JavaScript 构建动态用户界面功能的库,而 Node.js 将 JavaScript 扩展到服务器端编程。

4. **全栈开发**:这些技术的组合允许实现全栈开发,开发人员可以在 Web 应用程序的前端(React、HTML、CSS)和后端(Django、Flask、Node.js)上工作。

### 结论:
该列表代表了现代 Web 开发必不可少的一套全面的工具和语言。了解这些项目的关系和作用可以帮助开发人员为他们的项目选择合适的技术,无论他们专注于前端、后端还是全栈开发。

--------------------------------------------------
# 带有动态指令的模板
dynamic_instruction_template = PromptTemplate(
    template="任务:{{ task }} \n " 
              "上下文:{{ context }} \n " 
              "约束:{{ constrains }} \n\n " 
              "请提供一个解决任务、考虑上下文并遵守约束的解决方案。",
    input_variables=["task", "context", "constraints"]
)

# 使用动态指令模板
print("动态指令模板结果:")
prompt = dynamic_instruction_template.format(
    task="为一家科技初创公司设计一个标志",
    context="该初创公司专注于人工智能驱动的医疗保健解决方案",
    constraints="必须使用蓝色和绿色,并且应该足够简单,以便在小的时候可以识别"
)
print(get_completion(prompt))
动态指令模板结果:
### 人工智能医疗初创公司的标志设计概念

**1. 标志元素:**
   - **符号**:风格化的大脑与医学十字相结合。大脑代表人工智能和智能,而医学十字象征医疗保健。这两个元素可以交织在一起,展现科技与健康的融合。
   - **排版**:使用现代无衬线字体作为公司名称,确保其简洁易读。字体应传达创新和专业精神。

**2. 调色板:**
   - **原色:**
     - **蓝色(#007BFF)**:代表信任、可靠性和技术。
     - **绿色(#28A745)**:象征着健康、成长和活力。
   - **用法**:大脑可以采用蓝色,而医疗十字可以采用绿色。这种颜色组合将营造出和谐而专业的外观。

**3. 设计风格:**
   - **简洁**:徽标应简约,避免在较小尺寸下可能看不到的复杂细节。形状应醒目清晰。
   - **可扩展性**:确保徽标缩小用于名片、网站或应用程序图标时仍能保持其完整性和可识别性。

**4. 布局:**
   - **水平布局**:将符号置于公司名称左侧,以达到平衡效果。此布局适用于各种应用,例如网站标题和宣传材料。
   - **垂直布局选项**:对于社交媒体资料或应用程序图标,可以创建公司名称上方带有符号的堆叠版本。

**5. 模型:**
   - 在不同背景(白色、浅灰色和深色)上创建徽标的模型,以确保在不同平台上的可见性和适应性。

### 最后的想法:
此标志设计理念有效地传达了这家初创公司对人工智能驱动的医疗保健解决方案的关注,同时遵守了指定的颜色限制并确保了简单易懂。大脑和医学十字的结合象征着医疗保健的创新方法,令人难忘且具有影响力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值