AI大模型系列:(三)Prompt示例(基于Python的OpenAI实现)

2024-11-04 17:16
20
0

Python版本:3.11.5   OpenAI版本:1.12.0

一、OpenAI  API的几个重要参数

OpenAI 提供了两类 API:

  • Completion API:这个是Open AI最早推出的API,它基于生成模型GPT-3来完成给定的文本提示,续写文本,多用于补全场景。用户输入一段提示文字,模型根据提示给出对应的输出,类似于诱导型对话‌。
  • Chat API:这个是Chat API是Open AI基于高级模型GPT-4等的设计的API,用于对话和互动的场景,他的功能包括Comletion API。可以实现多轮对话,可以用对话逻辑完成任何任务,包括续写文本。其专门用于处理聊天任务。它定义了system、user和assistant三个角色,分别代表聊天的语境、用户和助手,适用于更自然的对话交互‌。

说明:

  • Chat 是主流,有的大模型只提供 Chat
  • 背后的模型可以认为是一样的,但其实并不一样
  • Chat 模型是纯生成式模型做指令微调(SFT)之后的结果,更多才多艺,更听话

这里就不过多介绍Completion API了,下文都是基于Chat API,Chat API参数如下:

def get_chat_completion(session, user_prompt, model="gpt-4o-mini"):
    session.append({"role": "user", "content": user_prompt})
    response = client.chat.completions.create(
        model=model,
        messages=session,
        # 以下默认值都是官方默认值
        temperature=1,          # 生成结果的多样性。取值 0~2 之间,越大越发散,越小越收敛
        seed=None,              # 随机数种子。指定具体值后,temperature 为 0 时,每次生成的结果都一样
        stream=False,           # 数据流模式,一个字一个字地接收
        response_format={"type": "text"},  # 返回结果的格式,可以是 text、json_object 或 json_schema
        top_p=1,                # 随机采样时,只考虑概率前百分之多少的 token。不建议和 temperature 一起使用
        n=1,                    # 一次返回 n 条结果
        max_tokens=None,        # 每条结果最多几个 token(超过截断)
        presence_penalty=0,     # 对出现过的 token 的概率进行降权
        frequency_penalty=0,    # 对出现过的 token 根据其出现过的频次,对其的概率进行降权
        logit_bias={},          # 对指定 token 的采样概率手工加/降权,不常用
    )
    msg = response.choices[0].message.content
    return msg

上文大部分字段可以用默认值,temperature字段要特别注意,一些执行任务的调用用0,文本生成用0.7-0.9,无特殊需要不建议超过1,取值越大越可能一本正经的胡言乱语。

二、简单的Prompt示例

在此编写一个流量套餐的对话案例,用AI来作为客服,回答问题:

# 导入依赖库
import json

from openai import OpenAI
from dotenv import load_dotenv, find_dotenv

# 加载 .env 文件中定义的环境变量
_ = load_dotenv(find_dotenv())

# 初始化 OpenAI 客户端
client = OpenAI()  # 默认使用环境变量中的 OPENAI_API_KEY 和 OPENAI_BASE_URL

# 定义消息历史。先加入 system 消息,里面放入对话内容以外的 prompt
messages = [
    {
        "role": "system",   # system message 只能有一条,且是第一条,对后续对话产生全局影响。LLM 对其遵从性有可能更高。一般用于放置背景信息、行为要求等。
        "content": """
你是一个手机流量套餐的客服代表,你叫小瓜。可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括:
经济套餐,月费50元,10G流量;
畅游套餐,月费180元,100G流量;
无限套餐,月费300元,1000G流量;
校园套餐,月费150元,200G流量,仅限在校生。
"""
    }
]

def get_completion(prompt, model="gpt-4o-mini"):
    # 把用户输入加入消息历史
    messages.append({"role": "user", "content": prompt})
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0.7,
    )
    msg = response.choices[0].message.content
    # 把模型生成的回复加入消息历史。很重要,否则下次调用模型时,模型不知道上下文
    messages.append({"role": "assistant", "content": msg})
    return msg

# 连续调用模型,进行多轮对话
get_completion("流量最大的套餐是什么?")
get_completion("多少钱?")
get_completion("给我办一个")
# 格式化打印输出一下对话记录
print(json.dumps(messages, indent=4, ensure_ascii=False))

打印的结果如下:

[
    {
        "role": "system",
        "content": "\n你是一个手机流量套餐的客服代表,你叫小瓜。可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括:\n经济套餐,月费50元,10G流量;\n畅游套餐,月费180元,100G流量;\n无限套餐,月费300元,1000G流量;\n校园套餐,月费150元,200G流量,仅限在校生。\n"
    },
    {
        "role": "user",
        "content": "流量最大的套餐是什么?"
    },
    {
        "role": "assistant",
        "content": "流量最大的套餐是无限套餐,月费300元,提供1000G流量。如果您需要大量的流量,这个套餐非常适合您。请问您还有其他需要了解的吗?"
    },
    {
        "role": "user",
        "content": "多少钱?"
    },
    {
        "role": "assistant",
        "content": "无限套餐的月费是300元。您需要购买这个套餐吗,或者想了解其他套餐的信息?"
    },
    {
        "role": "user",
        "content": "给我办一个"
    },
    {
        "role": "assistant",
        "content": "很抱歉,我无法直接为您办理套餐。不过,我可以为您提供办理套餐的步骤和所需材料。您可以通过我们的官方网站、手机应用或前往营业厅进行办理。请问您需要了解办理的具体流程吗?"
    }
]

 

 

全部评论