Python OpenAI 使用

本文介绍大模型 gpt-3.5-turbo or gpt-4 的接入工具 OpenAI

安装方式:

pip install openai

# import the OpenAI Python library for calling the OpenAI API
from openai import OpenAI
import os

client = OpenAI(api_key="你的key")

一个简单的例子:

# Example OpenAI Python library request
MODEL = "gpt-3.5-turbo"
response = client.chat.completions.create(
    model=MODEL,
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Knock knock."},
        {"role": "assistant", "content": "Who's there?"},
        {"role": "user", "content": "Orange."},
    ],
    temperature=0,
)

参数说明:

        必须参数:

        model:模型名称 (e.g., gpt-3.5-turbogpt-4gpt-3.5-turbo-16k-1106)

        messages:消息列表,这个消息列表每个对象必须包含两个属性

                role: 消息的角色 如:systemuserassistant or tool

                content:消息内容,如: 讲个笑话

        可选参数:

        frequency_penalty: 根据令牌的出现频率进行惩罚,减少重复。 

        logit_bias: 使用偏差值修改指定令牌的可能性。 

        logprobs: 如果为真,则返回输出令牌的对数概率。 

        top_logprobs: 指定在每个位置返回的最可能令牌的数量。 

        max_tokens: 限制最大 token 数量。 

        n: 为每个输入生成指定数量的聊天完成选择。 

        presence_penalty: 根据文本中新令牌的出现进行惩罚。 

        response_format: 指定输出格式,例如JSON模式。 

        seed: 使用指定的种子确保确定性采样。 

        stop: 指定API应停止生成令牌的最多4个序列。 

        stream: 是否按流的方式发送消息。 

        temperature: 设置0到2之间的采样温度,0就是没有随机,数字大了随机性就越高,AI越会自 动发挥

        top_p: 使用核采样;考虑具有top_p概率质量的令牌。 

        tools: 列出模型可能调用的函数。 

        tool_choice: 控制模型的函数调用(none/auto/function)。 

        user: 用于终端用户监控和滥用检测的唯一标识符。

print(json.dumps(json.loads(response.model_dump_json()), indent=4))


{
    "id": "chatcmpl-8dee9DuEFcg2QILtT2a6EBXZnpirM",
    "choices": [
        {
            "finish_reason": "stop",
            "index": 0,
            "logprobs": null,
            "message": {
                "content": "Orange who?",
                "role": "assistant",
                "function_call": null,
                "tool_calls": null
            }
        }
    ],
    "created": 1704461729,
    "model": "gpt-3.5-turbo-0613",
    "object": "chat.completion",
    "system_fingerprint": null,
    "usage": {
        "completion_tokens": 3,
        "prompt_tokens": 35,
        "total_tokens": 38
    }
}
response 结构
  • id: 请求 id
  • choices: 完成的列表 (只有 1条, 除非你设置 n 大于 1)
    • finish_reason: 停止生成的原因 (可能是 stop, 或者 length 如果设置了max_tokens 并且达到了该限制)
    • index: 本条选项的索引.
    • logprobs: 概率信息.
    • message: 模型生成的消息
      • content: 消息内容
      • role: 角色
      • tool_calls: 模型生成的调用
  • created: 生成的时间戳
  • model: 模型名称
  • object: 返回的类型
  • system_fingerprint: 后台配置的指纹信息
  • usage: 统计信息,如消耗的 token 数
如何显示模型的回复消息
response.choices[0].message.content
输出:'Orange who?'

非对话场景使用

大模型不只是用来做对话,也可以要求大模型解释一些概念

def assistant():
    response = client.chat.completions.create(
        model="gpt-3.5-turbo-0613",
        messages=[
            {"role":"system", "content":"你是 Python 程序员."},
            {"role":"user","content":"解释一下什么是协程."}
        ],
        temperature=0
    )
    print(response.choices[0].message.content)



assistant()


输出:

协程是一种轻量级的线程,也被称为用户级线程或纤程。它是一种程序组件,可以在同一个线程中实现多个独立的执行流程,这些执行流程可以在需要时暂停、恢复和切换,而不需要进行线程上下文切换的开销。

与传统的线程相比,协程更加高效,因为它们不需要操作系统的介入。在协程中,程序员可以自行控制执行流程的切换,从而更好地利用计算资源。

协程的主要特点包括:

1. 轻量级:协程的创建和切换开销很小,可以在同一个线程中创建大量的协程。

2. 非抢占式:协程的执行是由程序员主动控制的,不会被操作系统中断,因此不会出现线程竞争的问题。

3. 可暂停和恢复:协程可以在任意时刻暂停执行,并在需要时恢复执行,这使得协程非常适合处理异步任务。

4. 共享状态:协程可以共享状态,因为它们在同一个线程中执行,可以直接访问共享的变量。

协程在异步编程中有广泛的应用,可以用于处理高并发的网络请求、IO操作等。通过使用协程,可以简化异步编程的复杂性,提高代码的可读性和可维护性。在Python中,协程可以使用asyncio库来实现。

Process finished with exit code 0

不给模型定义角色

def assistant():
    response = client.chat.completions.create(
        model="gpt-3.5-turbo-0613",
        messages=[
            # {"role":"system", "content":"你是计算机专家."},
            {"role":"user","content":"解释一下什么是协程."}
        ],
        temperature=0
    )
    print(response.choices[0].message.content)


assistant()


输出:


协程(Coroutine)是一种计算机程序组件,可以在执行过程中暂停和恢复。它是一种轻量级的线程,可以在不同的执行流之间切换,但与线程不同的是,协程的切换是由程序自身控制的,而不是由操作系统控制。

协程可以看作是一种特殊的函数,它可以在执行过程中暂停并保存当前的状态,然后在需要的时候恢复执行。这种暂停和恢复的能力使得协程可以在不同的任务之间切换,而不需要像线程那样频繁地进行上下文切换,从而提高了程序的执行效率。

协程的主要特点包括:
1. 轻量级:协程的创建和切换开销较小,不需要像线程那样创建新的进程或上下文切换。
2. 高效性:协程的切换是由程序自身控制的,可以根据具体的需求进行灵活的切换,避免了线程切换的开销。
3. 可控性:协程的执行流程由程序员控制,可以根据需要进行暂停、恢复和终止等操作。
4. 共享状态:协程可以共享状态,多个协程可以访问和修改同一个变量,但需要注意协程之间的同步和互斥问题。

协程在异步编程、并发编程和事件驱动编程等场景中具有广泛的应用,可以提高程序的性能和可维护性。常见的编程语言如Python、Go、JavaScript等都提供了对协程的支持。

Process finished with exit code 0

定义了角色和不定义角色的区别就是定义了角色会在该角色的角度去回答问题,而不是泛泛而谈。

结合生产使用的示例:

假如我现在要开发一个可以根据用户输入进行话费套餐推荐的客服,套餐包括:经济套餐,畅游套餐,校园套餐,无限套餐,如何通过 prompt 对接大模型给出一个结构化的数据或者一个套餐的名称?

先看看这段文字

你的任务是识别用户对手机流量套餐产品的选择条件。
每种流量套餐产品包含三个属性:名称(name),月费价格(price),月流量(data)。
根据用户输入,识别用户在上述三种属性上的需求是什么。
====================================================
以 JSON 格式输出
====================================================
1.name 类型:string 可以取值:经济套餐、畅游套餐、校园套餐、无限套餐
2.price 取值为一个结构体 或者 null, 包含两个字段
  2.1 operator 类型:string,取值范围: '<='(小于等于),'>='(大于等于), '=='(等于)
  2.2 value 类型: int
3.data 取值为一个结构体,或者 null, 包含两个字段
  3.1 operator 类型:string,取值范围: '<='(小于等于),'>='(大于等于), '=='(等于)
  3.2 value 类型: int 或者 string, string 类型时只能是 '无上限'
4.用户的意图可以包含通过 price 或 data 排序,以 sort 字段标识,取值为一个结构体:
  4.1 ordering 类型:string 取值范围 asc(正序)desc(倒序) 
  4.2 field 字段代表目标字段,取值范围为 price 或 data
====================================================
例如:
便宜的套餐:{"sort":{"ordering":"asc", "field":"price"}}
有没有无限套餐:{"data":{"operator":"==", "value":"无上限"}}
流量大的:{"sort":{"ordering":"desc", "field":"data"}}
100G以上最便宜的是哪个:{"sort":{"ordering":"asc", "field":"price"}, "data":{"operator":">=", "value":"100"}}
月费不超过200的:{"price":{"operator":"<=", "value":"200"}}
就要月费180那个套餐:{"price":{"operator":"==","value":180}}
经济套餐:{"name":"经济套餐"}
土豪套餐:{"name":"无限套餐"}

第一段告诉大模型:你要做什么

第二段告诉他:输出格式

第三段告诉他:json 格式的结构是什么样的

第四段告诉他一些例子,这样可以让大模型在遇到一些特殊情况的时候通过例子来寻找答案

把上面的这段文字作为 prompt 喂给大模型:

from openai import OpenAI

client = OpenAI(api_key="your key")

instruction = """
你的任务是识别用户对手机流量套餐产品的选择条件。
每种流量套餐产品包含三个属性:名称(name),月费价格(price),月流量(data)。
根据用户输入,识别用户在上述三种属性上的需求是什么。
====================================================
以 JSON 格式输出
====================================================
1.name 类型:string 可以取值:经济套餐、畅游套餐、校园套餐、无限套餐
2.price 取值为一个结构体 或者 null, 包含两个字段
  2.1 operator 类型:string,取值范围: '<='(小于等于),'>='(大于等于), '=='(等于)
  2.2 value 类型: int
3.data 取值为一个结构体,或者 null, 包含两个字段
  3.1 operator 类型:string,取值范围: '<='(小于等于),'>='(大于等于), '=='(等于)
  3.2 value 类型: int 或者 string, string 类型时只能是 '无上限'
4.用户的意图可以包含通过 price 或 data 排序,以 sort 字段标识,取值为一个结构体:
  4.1 ordering 类型:string 取值范围 asc(正序)desc(倒序) 
  4.2 field 字段代表目标字段,取值范围为 price 或 data
====================================================
例如:
便宜的套餐:{"sort":{"ordering":"asc", "field":"price"}}
有没有无限套餐:{"data":{"operator":"==", "value":"无上限"}}
流量大的:{"sort":{"ordering":"desc", "field":"data"}}
100G以上最便宜的是哪个:{"sort":{"ordering":"asc", "field":"price"}, "data":{"operator":">=", "value":"100"}}
月费不超过200的:{"price":{"operator":"<=", "value":"200"}}
就要月费180那个套餐:{"price":{"operator":"==","value":180}}
经济套餐:{"name":"经济套餐"}
土豪套餐:{"name":"无限套餐"}
"""
def get_completion(prompt, response_format="text", model="gpt-3.5-turbo"):
    messages = [
        {"role": "system", "content": instruction},
        {"role": "user", "content": prompt}
    ]
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0,
        # 返回消息的格式 text 或 json_object
        response_format={"type": response_format},
    )
    return response.choices[0].message.content


if __name__ == "__main__":
    input_text = "有没有土豪套餐"
    # input_text = "办个200G的套餐"
    # input_text = "有没有流量大的套餐"
    # input_text = "200元以下,流量大的套餐有啥"
    # input_text = "你说那个10G的套餐,叫啥名字"
    res = get_completion(input_text)
    print(res)

输出结果:

{"name":"无限套餐"}

通过大模型输出的结果,我们就能从数据库中捞出对应的产品返回给用户

官方文档:

How to format inputs to ChatGPT models | OpenAI Cookbook

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值