OpenAI的Prompt工程

OpenAI 的 Prompt 工程是指通过设计和构建与大语言模型进行交互的输入方式,以引导模型生成期望输出的过程。

任务:本文将以引导AI根据用户指令输出符合用户要求的json格式数据。

一)测试 Azure OpenAI 服务

import openai
import time
from openai import AzureOpenAI
from openai.types.chat import ChatCompletion
import json

class AIJSONProcessor:
    def __init__(self, endpoint, deployment, subscription_key, api_version, max_retries=2, timeout=30, proxy=None):
        self.endpoint = endpoint.rstrip('/')
        self.deployment = deployment
        self.subscription_key = subscription_key
        self.api_version = api_version
        self.max_retries = max_retries
        
        # 配置Azure OpenAI客户端
        self.client = AzureOpenAI(
            api_key=subscription_key,
            api_version=api_version,
            azure_endpoint=endpoint
        )
        
        # 设置超时
        self.timeout = timeout
    
    def testOpenaiConnection(self):
        '''
            测试程序
        '''
        for attempt in range(self.max_retries + 1):
            try:
                print(f"正在尝试连接到Azure OpenAI: {self.deployment} (尝试 {attempt + 1}/{self.max_retries + 1})")
                print(f"端点: {self.endpoint}")
                print(f"超时设置: {self.timeout}秒")
                
                # 调用Azure OpenAI API
                response = self.client.chat.completions.create(
                    model=self.deployment,
                    messages=[
                        {"role": "system", "content": "你是一个AI助手。"},
                        {"role": "user", "content": "你是openai的哪个版本"}
                    ],
                    max_tokens=50
                )
                
                # 提取模型回复
                message = response.choices[0].message.content.strip()
                return {
                    "success": True,
                    "deployment": self.deployment,
                    "response": message
                }
            except openai.AuthenticationError as e:
                return {
                    "success": False,
                    "error": "认证失败,请检查订阅密钥或API端点",
                    "details": str(e)
                }
            except openai.RateLimitError as e:
                wait_time = 2 ** attempt  # 指数退避
                print(f"速率限制错误,等待 {wait_time} 秒后重试...")
                time.sleep(wait_time)
                continue
            except openai.APITimeoutError as e:
                return {
                    "success": False,
                    "error": "请求超时,请检查网络连接或增加超时时间",
                    "details": str(e)
                }
            except openai.APIError as e:
                if attempt < self.max_retries:
                    wait_time = 2 ** attempt  # 指数退避
                    print(f"API错误: {str(e)},等待 {wait_time} 秒后重试...")
                    time.sleep(wait_time)
                    continue
                else:
                    return {
                        "success": False,
                        "error": "多次尝试后API请求仍失败",
                        "details": str(e)
                    }
            except ValueError as e:
                return {
                    "success": False,
                    "error": "配置错误,请确认OpenAI库版本和参数设置",
                    "details": str(e)
                }
            except Exception as e:
                return {
                    "success": False,
                    "error": "发生未知错误",
                    "details": str(e)
                }

processor = AIJSONProcessor(
    endpoint="https://XXXXX-openai.openai.azure.com/",
    deployment="gpt-4.1",
    subscription_key="10XXXXXXXXXXXXXXXXXXXXXXXXXXXe",
    api_version="2025-XXXXXX-preview",  
    max_retries=2,
    timeout=60,  
)

print("正在测试Azure OpenAI API连接...")
result = processor.testOpenaiConnection()

print(result)
  • endpoint  指定 Azure OpenAI 服务的 API 访问地址(端点)。
  • deployment 指定你在 Azure OpenAI 上部署的模型名称,告诉API要使用的是哪个模型。
  • subscription_key 你的 Azure OpenAI 订阅密钥(API Key)。
  • api_version 指定调用的 API 版本,Azure OpenAI 的 API 可能会有多个版本,不同版本可能有不同的功能或参数要求。
  • max_retries 请求失败时最多重试的次数。
  • timeout 每次 API 请求的超时时间(秒)。如果请求在指定时间内没有响应,就会报超时错误,防止程序一直卡住。

测试可以正常通信后,就可以开始构建OpenAI的Prompt工程了。

二)设计有效的提示词

 2.1 系统级prompt

在调用Azure OpenAI API的时候,会给AI传递对应的prompt

# 调用Azure OpenAI API
response = self.client.chat.completions.create(
    model=self.deployment,
    messages=[
        {"role": "system", "content": "你是一个AI助手。"},
        {"role": "user", "content": "你是openai的哪个版本"}
    ],
    max_tokens=50
)

在如上的示例中传递的prompt是两种类型的prompt,即系统级prompt和用户级prompt,实际上还有AI本身的prompt,这种prompt其实是保留AI之前的回答,在下次用户prompt输入的时候一起被输入,保留记忆。

 对于系统级prompt,其提示词会让AI明确自己的身份定位,从而制约说话语气,和表达方式。

由于本文任务是引导AI根据用户指令输出符合用户要求的json格式数据,其对于自身定位没有要求,只有一些前提可以告诉AI,比如json数据中属性对应的自然语言,这样AI就能理解自然语言的表达,并按着用户需求来生成对应的json格式数据。

其prompt设置如下:

referPrompt = 'json格式其属性和中文的对应关系如下:公司=company,姓名=name,年龄=age,工作经验=workExperience,职位=position,入职时间=duration'

当然,其实这个任务中不需要AI明确自己的身份定位,这个提示词也可以被放入用户提示词中。

2.2 用户级prompt

对于用户级别的prompt来说,该prompt的作用是核心的prompt,用户prompt是任务完美完成的核心,是影响着AI输出的关键。

# 示例JSON数据
input_data = {
    "name": "张三",
    "age": 25,
    "skills": ["Python", "SQL", "AI"],
    "workExperience": [
        {
            "company": "科技公司A",
            "position": "数据分析师",
            "duration": "2022-2024"
        }
    ]
}

aiPrompt = (
    prompt + "\n"
    "请创建新的 json。请不要添加任何说明文字或补充内容,严格遵守 json 格式,确保每一层级的括号必须    闭合,仅输出 json。"+ "\n"
    + json.dumps(input_data, ensure_ascii=False)
)

 2.3 AI级prompt

由于这里的任务不需要上下文的记忆,因此不需要加入词prompt。

三)测试

import openai
import time
from openai import AzureOpenAI
from openai.types.chat import ChatCompletion
import json

class AIJSONProcessor:
    def __init__(self, endpoint, deployment, subscription_key, api_version, max_retries=2, timeout=30, proxy=None):
        self.endpoint = endpoint.rstrip('/')  # 确保端点不以斜杠结尾
        self.deployment = deployment
        self.subscription_key = subscription_key
        self.api_version = api_version
        self.max_retries = max_retries
        
        # 配置Azure OpenAI客户端
        self.client = AzureOpenAI(
            api_key=subscription_key,
            api_version=api_version,
            azure_endpoint=endpoint
        )
        
        # 设置超时
        self.timeout = timeout
    
    def process(self, prompt):
        '''
            执行程序 参数列表
            prompt: 用户指令
        '''
        for attempt in range(self.max_retries + 1):
            try:
                print(f"正在尝试连接到Azure OpenAI: {self.deployment} (尝试 {attempt + 1}/{self.max_retries + 1})")
                print(f"端点: {self.endpoint}")
                print(f"超时设置: {self.timeout}秒")
                
                referPrompt = 'json格式其属性和中文的对应关系如下:公司=company,姓名=name,年龄=age,工作经验=workExperience,职位=position,入职时间=duration'
                
                # 示例JSON数据
                input_data = {
                    "name": "张三",
                    "age": 25,
                    "skills": ["Python", "SQL", "AI"],
                    "workExperience": [
                        {
                            "company": "科技公司A",
                            "position": "数据分析师",
                            "duration": "2022-2024"
                        }
                    ]
                }

                aiPrompt = (
                    prompt + "\n"
                    "请创建新的 json。请不要添加任何说明文字或补充内容,严格遵守 json 格式,确保每一层级的括号必须闭合,仅输出 json。"+"\n"
                    + json.dumps(input_data, ensure_ascii=False)
                )

                # 调用Azure OpenAI API
                response = self.client.chat.completions.create(
                    model=self.deployment,
                    messages=[
                        {"role": "system", "content": referPrompt },
                        {"role": "user", "content": aiPrompt }
                    ],
                    max_tokens=100
                )
                # 提取模型回复
                message = response.choices[0].message.content.strip()
                return message
            except openai.AuthenticationError as e:
                return {
                    "success": False,
                    "error": "认证失败,请检查订阅密钥或API端点",
                    "details": str(e)
                }
            except openai.RateLimitError as e:
                wait_time = 2 ** attempt  # 指数退避
                print(f"速率限制错误,等待 {wait_time} 秒后重试...")
                time.sleep(wait_time)
                continue
            except openai.APITimeoutError as e:
                return {
                    "success": False,
                    "error": "请求超时,请检查网络连接或增加超时时间",
                    "details": str(e)
                }
            except openai.APIError as e:
                if attempt < self.max_retries:
                    wait_time = 2 ** attempt  # 指数退避
                    print(f"API错误: {str(e)},等待 {wait_time} 秒后重试...")
                    time.sleep(wait_time)
                    continue
                else:
                    return {
                        "success": False,
                        "error": "多次尝试后API请求仍失败",
                        "details": str(e)
                    }
            except ValueError as e:
                return {
                    "success": False,
                    "error": "配置错误,请确认OpenAI库版本和参数设置",
                    "details": str(e)
                }
            except Exception as e:
                return {
                    "success": False,
                    "error": "发生未知错误",
                    "details": str(e)
                }


processor = AIJSONProcessor(
    endpoint="https://XXXXXXXXXXopenai.openai.azure.com/",
    deployment="gpt-4.1",
    subscription_key="103XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXfe",
    api_version="2025-0XXXXXXXXXeview",  
    max_retries=2,
    timeout=60,  
)

print("正在测试Azure OpenAI API连接...")
result = processor.process("把姓名改成cce,年龄改为22,职位改为小白")

print(result)

 

成功输出!!测试完成!! 

 

<think>好的,我现在要解决用户的问题:如何在OpenAI库中自定义prompt输入来生成文本。首先,我需要回顾一下用户提供的引用内容,尤其是引用[1]、[2]、[3],这些可能包含相关的指导。 根据引用[1],OpenAI的官方教程里提到了prompt工程的重要性,可能需要详细说明如何构造有效的prompt。用户可能想知道具体如何在代码中设置这些prompt。引用[2]提到了使用Gradio和非Gradio版本的自定义prompt创建,这可能涉及到界面设计,但用户的问题更偏向于代码层面的注入,所以可能需要参考其中的初始化模型和设置prompt的部分。引用[3]讨论了调用自定义工具,比如计算函数,来辅助模型生成回答,这可能涉及到在prompt中引导模型使用特定工具或格式。 接下来,我需要考虑用户可能的实际应用场景。他们可能希望动态生成不同风格的文本,或者让模型遵循特定结构输出。例如,在生成故事时,用户可能希望设定背景和角色,或者在处理数学问题时,需要模型调用计算函数后再回答。因此,步骤可能包括构造prompt的结构、处理模型响应、以及可能的后续处理。 然后,我应该整理具体的代码示例。根据引用[3],使用OpenAI库调用模型时,需要传递messages参数,其中包含系统提示和用户输入。系统提示用于设定模型的行为,用户输入则是具体的问题。例如,系统提示可以是“你是一个数学助手,需要调用计算函数解决问题”,然后用户提问“计算3的平方”。这样模型会生成相应的回答,可能需要解析回答中的指令来调用计算函数。 另外,引用[2]中提到的评估prompt的方法可能对用户有帮助,比如如何测试不同的prompt效果。用户可能需要了解如何调整prompt以提高生成文本的准确性或相关性。例如,在数学问题中,明确的系统提示能引导模型正确使用工具。 还需要注意,用户的问题中提到“注入prompt”,这可能是指在代码中动态插入特定的指令或上下文信息。因此,在示例代码中展示如何构建包含系统消息和用户消息的messages数组是关键。同时,需要解释每个部分的作用,比如role为system的消息设置模型行为,role为user的则是具体问题。 最后,要确保回答符合用户的要求:结构清晰,分步骤说明,引用相关文献,并生成相关问题。需要检查是否有遗漏的细节,比如API密钥的设置、错误处理,或者不同模型版本的影响。例如,GPT-3.5和GPT-4可能在处理复杂prompt时表现不同,可能需要提及模型选择的影响。 总结步骤: 1. 导入OpenAI库并设置API密钥。 2. 构造messages数组,包含系统提示和用户输入。 3. 调用API并处理响应。 4. 结合示例代码说明关键点。 5. 引用相关文献中的方法,如官方prompt工程指南。 6. 生成相关问题,帮助用户深入理解。</think>### 如何在OpenAI库中自定义Prompt输入生成文本 #### **步骤说明** 1. **导入OpenAI库并配置API密钥** 首先需要安装`openai`库并设置API密钥,确保能够调用模型服务: ```python import openai openai.api_key = "sk-你的API密钥" ``` 2. **构造Prompt消息** OpenAI的ChatCompletion接口要求输入一个包含`messages`的列表,每个消息需定义`role`(角色)和`content`(内容)。 - **系统提示(System Prompt)**:用于设定模型的角色或任务要求。 - **用户输入(User Input)**:具体的问题或指令。 ```python messages = [ {"role": "system", "content": "你是一个数学助手,需要调用计算函数解决问题后再回答。"}, # 系统级指令 {"role": "user", "content": "请计算3的平方根,保留两位小数。"} # 用户输入 ] ``` 3. **调用API生成响应** 使用`openai.ChatCompletion.create`方法发送请求,选择模型(如`gpt-3.5-turbo`)并传递`messages`: ```python response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=messages ) answer = response.choices[0].message['content'] print(answer) ``` 4. **处理模型响应** 根据需求解析响应内容。例如,若需要模型返回结构化数据(如JSON),可在系统提示中明确要求: ```python messages = [ {"role": "system", "content": "请以JSON格式输出答案,包含字段'result'和'steps'。"}, {"role": "user", "content": "解方程:x² + 2x - 3 = 0"} ] ``` #### **关键点** - **系统提示的重要性**:系统消息决定了模型的行为模式。例如,要求模型调用工具或遵循特定格式时需在系统提示中明确说明[^1]。 - **用户输入的灵活性**:用户消息可以是自然语言问题,也可以包含结构化指令(如代码片段)。 - **模型版本选择**:不同模型(如`gpt-4`与`gpt-3.5-turbo`)对复杂Prompt的理解能力存在差异[^2]。 #### **示例场景** 假设需要模型调用计算函数后再回答: ```python messages = [ {"role": "system", "content": "你需先调用calculate函数处理数学问题,再返回结果。例如:用户输入'3+5'时,你应输出'计算结果为8'。"}, {"role": "user", "content": "请计算积分∫₀¹ x² dx"} ] response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=messages ) print(response.choices[0].message['content']) # 输出:计算结果为0.333 ``` #### **优化建议** - **清晰性**:Prompt需简洁明确,避免歧义。例如,指定输出格式时提供示例。 - **上下文管理**:若对话需多轮交互,需保留历史消息以维持上下文连贯性[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值