返回顶部

AI 大模型应用最佳实践

如何提升 GPT 模型使用效率与质量

 技巧与原则

  •  角色设定:擅于使用 System 给GPT设定角色和任务,如“哲学大师” ; 

  • 指令注入:在 System 中注入常驻任务指令,如“主题创作” ; 

  • 问题拆解:将复杂问题拆解成的子问题,分步骤执行,如:Debug 和多任务;

  • 分层设计:创作长篇内容,分层提问,先概览再章节,最后补充细节,如:小说生成;

  • 编程思维:将prompt当做编程语言,主动设计变量、模板和正文,如:评估模型输出质量; 

  • Few-Shot:基于样例的prompt设计,规范推理路径和输出样式,如:构造训练数据;

AI 大模型应用最佳实践 Official Playground

playground 链接

  • https://platform.openai.com/playground/

Playground 赋予不同的角色

给 GPT 赋予哲学大师

import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {
      "role": "system",
      "content": "对于我的所有问题,你都用大道至简的佛学或中国哲学来解答,\n不要喝嗦,要有大师范儿。"
    },
    {
      "role": "user",
      "content": "为什么天天要上班,还是学不到东西"
    },
    {
      "role": "assistant",
      "content": "善知识,人生在世,常常需要通过工作来维持生计。然而,工作的目的并不仅仅是为了学习知识,而是为了体验和修行。在工作过程中,我们有机会锻炼自己的专业技能、人际交往能力和解决问题的能力。有时候,我们可能感觉学不到东西是因为我们对自己的工作态度不正确,没有把工作看作是一种修行的机会。\n\n行者,我教你古人所云:“工欲善其事,必先利其器。”在工作中,我们要善用工具、技能和知识,不断提升自己的专业素养和学习能力。此外,我们还要虚心向他人学习,与同事们互动交流、分享经验和观点。倾听他人"
    }
  ],
  temperature=1,
  max_tokens=256,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0
)
哲学大师

 

内容创作与生成

import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {
      "role": "system",
      "content": "对于陈列出的每一个[话题],创作100字的内容,体现话题的论\n点,语言风趣幽默。"
    },
    {
      "role": "user",
      "content": "对于我的话题,你要从3个不同的角度进行分析和阐述,并最终形成一个完整的观点,\n世界上最好的编程语言是什么?"
    },
    {
      "role": "assistant"
    },
    {
      "role": "assistant",
      "content": "角度一:简洁易学\n世界上最好的编程语言当属Python。它简洁易学,就像大海中的一条鲤鱼,让初学者能快速入门。Python有着清晰的语法结构,优雅的表达方式,让人感觉轻松自在。使用Python编写代码,就像"
    }
  ],
  temperature=1,
  max_tokens=256,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0
)
内容创作与生成

 

文章摘要和总结

import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {
      "role": "system",
      "content": "您将获得一对关于同一主题的文章(用一标签分隔)。\n首先总结每篇文章的论点。然后指出哪篇文章提出了更好的论\n点,并解释原因。"
    },
    {
      "role": "user",
      "content": "1.[PHP是世界上最好的语言]\nPHP是世界上最好的情感派编程语言,无需逻辑和算法,只要情绪。它能被蛰伏在冰箱里的PHP大神轻易驾\n取,会话结束后的感叹号也能传达对代码的热情。写PHP就像是在做被萨,不需要想那么多,只需把配料全\n部扔进一个碗,然后放到服务器上,热乎乎出炉的网页就好了。\n2.[Python是世界上最好的语言]\nPython是世界上最好的拜金主义者语言。它坚信:美丽就是力量,简洁就是灵魂。Pytho就像是那个永远在\n你皱眉的那一刻扔给你言情小说的好友。只有Pythoi,你才能够在两行代码之间感受到飘逸的花香和清新的\n微风。记住,这世上只有一种语言可以使用空格来领导全世界的进步,那就是Pytho。\n3.[Java是世界上最好的语言]\nJava是世界上最好的德育课编程语言,它始终坚守了严谨、安全的编程信条。Java就像一个严格的老师,他\n不会对你怀柔,不会让你偷懒,也不会让你走捷径,但他教会你规范和自律。Jv就像是那个喝咖啡也算加\n班费的上司,拥有对邪恶的深度厌恶和对善良的深度拥护"
    },
    {
      "role": "assistant",
      "content": "第一篇文章的论点是\"PHP是世界上最好的语言\",并强调PHP的简单性和情感派特点。\n第二篇文章的论点是\"Python是世界上最好的语言\",并强调Python的美学和简洁性。\n第三篇文章的论点是\"Java是世界上最好的语言\",并强调Java的严谨和安全性。\n\n我认为第三篇文章提出了更好的论点。原因是它强调了Java的严谨和安全的编程信条,与其他两篇文章相比更加专业和实际。尽管第一篇文章试图让读者相信PHP的简单性和情感特点,但它的观点相对较为主观和不具备广泛的适用性。第二篇文章强调Python的美学和简洁性,但这些特点并不一定"
    }
  ],
  temperature=1,
  max_tokens=256,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0
)
View Code

 

 Moderation

程序分析

import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {
      "role": "system",
      "content": "您将收到DEBUG问题,将每个问题分类为报错日志分析、根因\n可能性推断、解决方案、参考资料,分点陈列输出,格式如下所\n示:\n报错日志分析:\n根因可能性推断:\n解决方案:\n参考资料:"
    },
    {
      "role": "user",
      "content": "openai.error.APIConnectionError:Error communicating with OpenAI:\nSOCKSHTTPSConnectionPool(host='api.openai.com',port=443):Max retries exceeded with url:\n/v1/engines/text-embedding-ada-002/embeddings(Caused by SSLError(SSLEOFError(8,'EOF\noccurred in violation of protocol(ssl.c1007刀))"
    },
    {
      "role": "assistant",
      "content": "报错日志分析:\nopenai.error.APIConnectionError:Error communicating with OpenAI: SOCKSHTTPSConnectionPool(host='api.openai.com',port=443):Max retries exceeded with url: /v1/engines/text-embedding-ada-002/embeddings(Caused by SSLError(SSLEOFError(8,'EOF occurred in violation of protocol(ssl.c1007\n\n根因可能性推断:\n根据错误日志可以看出,出现了与OpenAI的通信错误。其中涉及到了一个SSLError。根据错误堆栈信息可以推断可能是由于SSL协议的问题导致连接中断。\n\n解决方案:\n1. 检查网络连接:首先,确保您的网络连接正常并且没有任何代理、VPN等网络设置干扰。尝试重新连接到OpenAI的API,确保网络连接稳定。\n\n2. 更新SSL证书:如果问题仍然存在,尝试更新或重新安装SSL证书。可以通过下载和安装最新的SSL证书来解决此问题。\n\n3. 联系技术支持:如果以上解决方案仍然无效,请联系OpenAI的技术支持团队,向他们详细描述您遇到的问题并提交错误报告。他们可能会提供更具体的解决方案或帮助您诊断问题的根本原因。\n\n参考资料:\n1. OpenAI官方文档:https://openai.com/docs/\n2. SSL证书更新指南:https://www.ssl.com/how-to/update-or-renew-ssl-certificates/"
    }
  ],
  temperature=1,
  max_tokens=1814,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0
)
View Code

新特性:Function Calling 介绍与实战

基于 Chat Completions API 实现外部函数调用

2023年6月20日,OpenAI 官方在 Chat Completions API 原有的三种不同角色设定(System, Assistant, User)基础上,新增了 Function Calling 功能

详见OpenAI Blog

functions 是 Chat Completion API 中的可选参数,用于提供函数定义。其目的是使 GPT 模型能够生成符合所提供定义的函数参数。请注意,API不会实际执行任何函数调用。开发人员需要使用GPT 模型输出来执行函数调用。

如果提供了functions参数,默认情况下,GPT 模型将决定在何时适当地使用其中一个函数。

可以通过将function_call参数设置为{"name": "<insert-function-name>"}来强制 API 使用指定函数。

同时,也支持通过将function_call参数设置为"none"来强制API不使用任何函数。

如果使用了某个函数,则响应中的输出将包含"finish_reason": "function_call",以及一个具有该函数名称和生成的函数参数的function_call对象。

本 Notebook 介绍了如何将 Chat Completions API 与外部函数结合使用,以扩展 GPT 模型的功能。包含以下2个部分:

  • 如何使用 functions 参数
  • 如何使用 function_call 参数
  • 使用 GPT 模型生成函数和参数
  • 实际执行 GPT 模型生成的函数(以 SQL 查询为例)

安装依赖包

pip install scipy tenacity tiktoken termcolor openai requests

导入依赖包 

import json
import openai
import requests
from tenacity import retry, wait_random_exponential, stop_after_attempt
from termcolor import colored

GPT_MODEL = "gpt-3.5-turbo"

定义工具函数

首先,让我们定义一些用于调用聊天完成 API 的实用工具,并维护和跟踪对话状态。

# 使用了retry库,指定在请求失败时的重试策略。
# 这里设定的是指数等待(wait_random_exponential),时间间隔的最大值为40秒,并且最多重试3次(stop_after_attempt(3))。
# 定义一个函数chat_completion_request,主要用于发送 聊天补全 请求到OpenAI服务器
@retry(wait=wait_random_exponential(multiplier=1, max=40), stop=stop_after_attempt(3))
def chat_completion_request(messages, functions=None, function_call=None, model=GPT_MODEL):

    # 设定请求的header信息,包括 API_KEY
    headers = {
        "Content-Type": "application/json",
        "Authorization": "Bearer " + openai.api_key,
    }

    # 设定请求的JSON数据,包括GPT 模型名和要进行补全的消息
    json_data = {"model": model, "messages": messages}

    # 如果传入了functions,将其加入到json_data中
    if functions is not None:
        json_data.update({"functions": functions})

    # 如果传入了function_call,将其加入到json_data中
    if function_call is not None:
        json_data.update({"function_call": function_call})

    # 尝试发送POST请求到OpenAI服务器的chat/completions接口
    try:
        response = requests.post(
            "https://api.openai.com/v1/chat/completions",
            headers=headers,
            json=json_data,
        )
        # 返回服务器的响应
        return response

    # 如果发送请求或处理响应时出现异常,打印异常信息并返回
    except Exception as e:
        print("Unable to generate ChatCompletion response")
        print(f"Exception: {e}")
        return e

定义一个函数pretty_print_conversation,用于打印消息对话内容

def pretty_print_conversation(messages):

    # 为不同角色设置不同的颜色
    role_to_color = {
        "system": "red",
        "user": "green",
        "assistant": "blue",
        "function": "magenta",
    }

    # 遍历消息列表
    for message in messages:

        # 如果消息的角色是"system",则用红色打印“content”
        if message["role"] == "system":
            print(colored(f"system: {message['content']}\n", role_to_color[message["role"]]))

        # 如果消息的角色是"user",则用绿色打印“content”
        elif message["role"] == "user":
            print(colored(f"user: {message['content']}\n", role_to_color[message["role"]]))

        # 如果消息的角色是"assistant",并且消息中包含"function_call",则用蓝色打印"function_call"
        elif message["role"] == "assistant" and message.get("function_call"):
            print(colored(f"assistant[function_call]: {message['function_call']}\n", role_to_color[message["role"]]))

        # 如果消息的角色是"assistant",但是消息中不包含"function_call",则用蓝色打印“content”
        elif message["role"] == "assistant" and not message.get("function_call"):
            print(colored(f"assistant[content]: {message['content']}\n", role_to_color[message["role"]]))

        # 如果消息的角色是"function",则用品红色打印“function”
        elif message["role"] == "function":
            print(colored(f"function ({message['name']}): {message['content']}\n", role_to_color[message["role"]]))

如何使用 functions 参数

这段代码定义了两个可以在程序中调用的函数,分别是获取当前天气和获取未来N天的天气预报。

每个函数(function)都有其名称、描述和需要的参数(包括参数的类型、描述等信息)。

posted @ 2023-10-08 16:52  Crazymagic  阅读(195)  评论(0编辑  收藏  举报