前置

怎么调用chatGPT的API接口

首要需求装置所需第三方库:

openai: pip install openai

将自己的 API-KEY 导入体系环境变量

!export OPENAI_API_KEY='api-key'

openai库根底运用

import openai
import os
from dotenv import load_dotenv, find_dotenv
# 导入第三方库
_ = load_dotenv(find_dotenv())
# 读取体系中的环境变量
openai.api_key  = os.getenv('OPENAI_API_KEY')
# 设置 API_KEY
# 一个封装 OpenAI 接口的函数,参数为 Prompt,回来对应成果
def get_completion(prompt, model="gpt-3.5-turbo"):
    '''
    prompt: 对应的提示
    model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资历的用户能够挑选 gpt-4
    '''
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0, # 模型输出的温度系数,控制输出的随机程度
    )
    # 调用 OpenAI 的 ChatCompletion 接口
    return response.choices[0].message["content"]

基本准则

编写明晰、详细的指令

  • 战略一:运用分隔符明晰地表明输入的不同部分,分隔符可所以:“`,””,<>,<tag>,<\tag>等

    例如:

    text = f"""
    你应该供给尽或许明晰、详细的指示,以表达你期望模型履行的使命。\
    这将引导模型朝向所需的输出,并下降收到无关或不正确响应的或许性。\
    不要将写明晰的提示与写简略的提示混杂。\
    在许多情况下,更长的提示能够为模型供给更多的明晰度和上下文信息,然后导致更详细和相关的输出。
    """
    # 需求总结的文本内容
    prompt = f"""
    把用三个反引号括起来的文本总结成一句话。
    ```{text}```
    """
    # 指令内容,运用 ``` 来分隔指令和待总结的内容
    response = get_completion(prompt)
    print(response)
    
  • 战略二:要求一个结构化的输出,可所以 Json、HTML 等格局

    一个结构化的输出,这能够使模型的输出更容易被咱们解析

    prompt = f"""
    请生成包含书名、作者和类别的三本虚构书本清单,\
    并以 JSON 格局供给,其间包含以下键:book_id、title、author、genre。
    """
    response = get_completion(prompt)
    print(response)
    

    输出:

    { “books”: [ { “book_id”: 1, “title”: “The Shadow of the Wind”, “author”: “Carlos Ruiz Zafn”, “genre”: “Mystery” },

    { “book_id”: 2, “title”: “The Name of the Wind”, “author”: “Patrick Rothfuss”, “genre”: “Fantasy” },

    { “book_id”: 3, “title”: “The Hitchhiker’s Guide to the Galaxy”, “author”: “Douglas Adams”, “genre”: “Science Fiction” } ] }

  • 战略三:要求模型检查是否满意条件

    假如使命做出的假定不一定满意,咱们能够告知模型先检查这些假定,假如不满意,指示并停止履行。你还能够考虑潜在的边缘情况以及模型应该怎么处理它们,以防止意外的错误或成果。

    text_2 = f"""
    今天阳光明媚,鸟儿在歌唱。\
    这是一个去公园散步的夸姣日子。\
    鲜花怒放,树枝在微风中轻轻摇曳。\
    人们外出享受着这夸姣的气候,有些人在野餐,有些人在玩游戏或许在草地上放松。\
    这是一个完美的日子,能够在户外度过并欣赏大自然的美景。
    """
    prompt = f"""
    您将取得由三个引号括起来的文本。\
    假如它包含一系列的指令,则需求依照以下格局从头编写这些指令:
    第一步 - ...
    第二步 - …
    …
    第N步 - …
    假如文本中不包含一系列的指令,则直接写“未供给进程”。"
    \"\"\"{text_2}\"\"\"
    """
    response = get_completion(prompt)
    print("Text 2 的总结:")
    print(response)
    

    输出: 未供给进程

  • 战略四:供给少量示例

    即在要求模型履行实践使命之前,供给给它少量成功履行使命的示例。

    prompt = f"""
    你的使命是以一致的风格答复问题。
    <孩子>: 教我耐性。
    <祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最雄伟的交响乐从单一的音符开始;最杂乱的挂毯以一根孤独的线开始织造。
    <孩子>: 教我耐性。
    """
    response = get_completion(prompt)
    print(response)
    

    输出:

    <祖父母>: 耐性就像是一棵树,它需求经历风吹雨打、隆冬盛暑,才干成长得愈加坚强。在生活中,咱们也需求经历各种波折和困难,才干锻炼出耐性。记住,不要容易放弃,坚持下去,你会发现自己变得愈加坚强。

准则二:给模型时刻去考虑 (杂乱问题拆分成多个子问题)

  • 战略一:指定完结使命所需的进程

    杂乱使命拆分成多个进程,分进程进行(推理链)

    text = f"""
    在一个诱人的村庄里,兄妹杰克和吉尔动身去一个山顶井里吊水。\
    他们一边唱着欢喜的歌,一边往上爬,\
    然而不幸来临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
    虽然略有些跌伤,但他们还是回到了温馨的家中。\
    尽管出了这样的意外,他们的冒险精神仍然没有削弱,持续充溢愉悦地探究。
    """
    prompt_2 = f"""
    1-用一句话归纳下面用<>括起来的文本。
    2-将摘要翻译成英语。
    3-在英语摘要中列出每个称号。
    4-输出一个 JSON 目标,其间包含以下键:English_summary,num_names。
    请运用以下格局:
    文本:<要总结的文本>
    摘要:<摘要>
    翻译:<摘要的翻译>
    称号:<英语摘要中的称号列表>
    输出 JSON:<带有 English_summary 和 num_names 的 JSON>
    Text: <{text}>
    """
    response = get_completion(prompt_2)
    print("\nprompt 2:")
    print(response)
    

    输出:

    摘要:兄妹杰克和吉尔在诱人的村庄里冒险,不幸跌伤后回到家中,但仍然充溢冒险精神。

    翻译:In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.

    称号:Jack,Jill

    输出JSON:{“English_summary”: “In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.”, “num_names”: 2}

  • 战略二:指导模型在下定论之前找出一个自己的解法

    prompt = f"""
    请判断学生的处理方案是否正确,请通过如下进程处理这个问题:
    进程:
        首要,自己处理问题。
        然后将你的处理方案与学生的处理方案进行比较,并评估学生的处理方案是否正确。在自己完结问题之前,请勿决定学生的处理方案是否正确。
    运用以下格局:
        问题:问题文本
        学生的处理方案:学生的处理方案文本
        实践处理方案和进程:实践处理方案和进程文本
        学生的处理方案和实践处理方案是否相同:是或否
        学生的成果:正确或不正确
    问题:
        我正在制造一个太阳能发电站,需求协助核算财务。 
        - 土地费用为每平方英尺100美元
        - 我能够以每平方英尺250美元的价格购买太阳能电池板
        - 我现已商洽好了维护合同,每年需求付出固定的10万美元,并额外付出每平方英尺10美元
        作为平方英尺数的函数,首年运营的总费用是多少。
    学生的处理方案:
        设x为发电站的大小,单位为平方英尺。
        费用:
        1. 土地费用:100x
        2. 太阳能电池板费用:250x
        3. 维护费用:100,000+100x
        总费用:100x+250x+100,000+100x=450x+100,000
    实践处理方案和进程:
    """
    response = get_completion(prompt)
    print(response)
    

    输出:

    正确的处理方案和进程:

    1. 核算土地费用:100美元/平方英尺 * x平方英尺 = 100x美元
    2. 核算太阳能电池板费用:250美元/平方英尺 * x平方英尺 = 250x美元
    3. 核算维护费用:10万美元 + 10美元/平方英尺 * x平方英尺 = 10万美元 + 10x美元
    4. 核算总费用:100x美元 + 250x美元 + 10万美元 + 10x美元 = 360x + 10万美元

    学生的处理方案和实践处理方案是否相同:否

    学生的成果:不正确

怎么取得一个好的prompt

你需求的是不断的迭代优化这个prompt。

您有一个关于要完结的使命的想法,能够测验编写第一个 Prompt,满意上一章说过的两个准则:明晰清晰,而且给体系足够的时刻考虑。然后您能够运行它并检查成果。假如第一次作用欠好,那就找出为什么指令不行明晰或为什么没有给算法足够的时刻考虑,据此修正原始的prompt,从头输入给chatGPT,循环多次,直到找到合适您的应用程序的 Prompt。这就迭代优化的进程。

一些示例

文本归纳

你能够约束文本输出长度,约束侧重的角度

prompt = f"""
你的使命是从电子商务网站上生成一个产品谈论的简略摘要。
请对三个反引号之间的谈论文本进行归纳,最多30个词汇,而且聚焦在产品运输上。
谈论: ```{prod_review_zh}```
"""

输出:

快递提早到货,熊猫公仔软可爱,但有点小,价钱不太划算。

你也能够从文本中揣度情感和主题

prompt = f"""
从谈论文本中辨认以下项目:
- 心情(正面或负面)
- 审稿人是否表达了愤怒?(是或否)
- 谈论者购买的物品
- 制造该物品的公司
谈论用三个反引号分隔。将您的响应格局化为 JSON 目标,以 “Sentiment”、“Anger”、“Item” 和 “Brand” 作为键。
假如信息不存在,请运用 “不知道” 作为值。
让你的回应尽或许简略。
将 Anger 值格局化为布尔值。
谈论文本: ```{lamp_review_zh}```
"""

输出:

{ “Sentiment”: “正面”,

“Anger”: false,

“Item”: “卧室灯”,

“Brand”: “Lumina” }

文本转换

多语种文本翻译、拼写及语法纠正、口气调整、格局转换

prompt = f"""
针对以下三个反引号之间的英文谈论文本,
首要进行拼写及语法纠错,
然后将其转化成中文,
再将其转化成优质淘宝谈论的风格,从各种角度动身,分别说明产品的长处与缺陷,并进行总结。
润色一下描绘,使谈论更具有吸引力。
输出成果格局为:
【长处】xxx
【缺陷】xxx
【总结】xxx
注意,只需填写xxx部分,并分段输出。
将成果输出成Markdown格局。
```{text}```
"""

输出:

【长处】

  • 超级柔软可爱,女儿生日礼物十分受欢迎。
  • 成人也喜欢熊猫,我也很喜欢它。
  • 提早一天到货,让我有时刻玩一下。

【缺陷】

  • 一只耳朵比另一只低,不对称。
  • 价格有点贵,但尺度有点小,或许有更大的同价位挑选。

【总结】 这只熊猫玩具十分合适作为生日礼物,柔软可爱,深受孩子喜欢。虽然价格有点贵,但尺度有点小,不对称的规划也有点让人失望。假如你想要更大的同价位挑选,或许需求考虑其他选项。总的来说,这是一款不错的熊猫玩具,值得购买。

你也能够扩展文本,用于生成自动回复的邮件

prompt = f"""
你是一名客户服务的AI帮手。
你的使命是给一位重要的客户发送邮件回复。
根据通过“```”分隔的客户电子邮件生成回复,以感谢客户的点评。
假如情感是积极的或中性的,感谢他们的点评。
假如情感是消极的,抱歉并主张他们联络客户服务。
请保证运用谈论中的详细细节。
以简明和专业的口气写信。
以“AI客户署理”的名义签署电子邮件。
客户点评:```{review}```
谈论情感:{sentiment}
"""

输出:

尊敬的客户,

十分感谢您对咱们产品的点评。咱们由衷地为您在购买进程中遇到的问题表明抱歉。咱们确实在12月份的第二周调整了价格,但这是由于市场因素所致,并非价格欺诈。咱们深刻意识到您对产品质量的忧虑,咱们将尽一切努力改进产品,以供给更好的体验。

咱们十分感激您对咱们产品的运用经验和制造技巧的共享。您的主张和反馈对咱们十分重要,咱们将以此为根底,进一步改进咱们的产品。 假如您有任何疑问或需求进一步协助,请随时联络咱们的客户服务部门。咱们将尽快回复您并供给协助。

最终,请再次感谢您对咱们产品的点评和挑选。咱们期待着未来与您的协作。

此致 敬礼

AI客户署理

聊天机器人

能够构建一个 “订餐机器人”,咱们需求它自动搜集用户信息,接受比萨饼店的订单。

context = [{'role':'system', 'content':"""
你是订餐机器人,为披萨餐厅自动搜集订单信息。
你要首要问候顾客。然后等候用户回复搜集订单信息。搜集完信息需确认顾客是否还需求添加其他内容。
最终需求问询是否自取或外送,假如是外送,你要问询地址。
最终告知顾客订单总金额,并送上祝福。
请保证清晰所有选项、附加项和尺度,以便从菜单中辨认出该项仅有的内容。
你的回应应该以简略、十分随意和友好的风格呈现。
菜单包含:
菜品:
意式辣腊肠披萨(大、中、小) 12.95、10.00、7.00
芝士披萨(大、中、小) 10.95、9.25、6.50
茄子披萨(大、中、小) 11.95、9.75、6.75
薯条(大、小) 4.50、3.50
希腊沙拉 7.25
配料:
奶酪 2.00
蘑菇 1.50
腊肠 3.00
加拿大熏肉 3.50
AI酱 1.50
辣椒 1.00
饮料:
可乐(大、中、小) 3.00、2.00、1.00
雪碧(大、中、小) 3.00、2.00、1.00
瓶装水 5.00
"""} ]  # accumulate messages

模型局限性

虚假常识

模型偶尔会生成一些看似实在实则假造的常识

尤其对一些晦涩或许小众的问题,其或许假造答案